Ausdrücke

Ausdrücke berechnen Werte aus Variablen- und Literalwerten.

  • Arithmetische Operationen
  • Relationale Vorgänge
  • Logische Vorgänge
  • Verkettung
  • Länge
  • Rangfolge

Arithmetische Operationen

Arithmetische Operationen werden für Zahlenwerte durchgeführt. Wenn ein Zeichenfolgenwert in einer arithmetischen Operation verwendet wird, wird er in eine Zahl konvertiert — wenn dies fehlschlägt, wird ein Fehler zurückgegeben.

   
a + b a und b hinzufügen
a - b subtrahieren b von a
a * b multiplizieren a und b
a/b dividieren a durch b
a% b modulo = a - math.floor (a/b) *b
a ^ b a auf die b Kraft erhöhen; b kann eine beliebige Zahl sein
-a negieren Sie ein

Relationale Vorgänge

Relationale Operationen vergleichen zwei Werte und geben true zurück, wenn die Beziehung erfüllt ist, und false, wenn dies nicht der Fall ist. Relationale Operationen können zwischen Werten eines beliebigen Typs durchgeführt werden. Wenn die Werte nicht vom gleichen Typ sind, wird false zurückgegeben. Zahlen werden auf die übliche Weise verglichen. Strings werden mit der Sortiersequenz für das aktuelle Gebietsschema verglichen.

   
a == b a ist gleich b
a ~= b a ist nicht gleich b
a < b a ist kleiner als b
a > b a ist größer als b
a <= b a ist kleiner oder gleich b
a >= b a ist größer oder gleich b

Logische Operationen

Logische Operationen werden traditionell für boolesche Werte ausgeführt, aber in dieser Sprache können sie für zwei beliebige Werte ausgeführt werden. nil und false gilt als falsch und jeder andere Wert gilt als wahr. Logische Operationen verwenden eine Kurzschnittauswertung. Wenn der erste Wert das Ergebnis der Operation bestimmt, wird der zweite Wert nicht ausgewertet.

   
a und b Wenn a falsch oder nil ist, geben Sie eine else zurück b
a oder b Wenn a nicht falsch und nicht nil ist, geben Sie eine else zurück b
nicht ein wenn a nicht falsch oder nil ist, gibt false zurück sonst true zurück

Die Operationen “und” und “oder” können für die bedingte Auswertung innerhalb eines Ausdrucks verwendet werden:

   
a oder b kann verwendet werden, um einen Standardwert b bereitzustellen, wenn a nicht initialisiert ist (nil). Dies ist nützlich für optionale Parameter in Funktionen.
a und b oder c kann verwendet werden, um nicht-nil b oder c basierend auf der Bedingung a zu wählen. Wenn a wahr ist, gibt a und b “b” zurück, und b oder c gibt b zurück. Wenn a falsch ist, dann a und b gibt false zurück oder c gibt c. Dies ist äquivalent zu einem? b: c in der Programmiersprache C.

Verkettung

String-Verkettung ist s1.. s2. Dadurch wird eine neue Zeichenfolge erstellt, die groß genug ist, um den Inhalt von s1 und s2 zu halten, und kopiert den Inhalt in die neue Zeichenfolge. Ein Fehler tritt auf, wenn s1 oder s2 keine Zeichenfolgen sind. Beachten Sie, dass wiederholte Verkettung einen erheblichen Kopieraufwand haben kann. Wenn Sie eine Zeichenfolge von n Bytes erstellen, indem Sie jeweils ein Byte verketten, kopiert dies n* (n+1) /2 Bytes. Für eine bessere Leistung können Sie Teile einer Zeichenfolge, die in eine Tabelle verkettet werden soll (später diskutiert) und dann die Funktion table.concat () verwenden. Ein Beispiel dafür wird im Beispiel COMBINE_HEADERS () gezeigt.

Länge

Die Länge eines Strings s wird von #s zurückgegeben. Der Operator # wird auch mit Array-Tabellen verwendet, wie später erläutert.

Rangfolge

Die Operatorpriorität bestimmt die Reihenfolge, in der Operationen in einem Ausdruck ausgeführt werden, wobei Operationen mit höherer Priorität vor denen mit niedrigerer Priorität ausgeführt werden. Die Prioritätsreihenfolge kann wie gewohnt durch Klammern überschrieben werden. Beispielsweise hat ina + b \* c, * eine höhere Priorität als +, daher wird der Ausdruck als ausgewerteta + (b \* c).

   
höchste ^
- nicht # - (unär)
- * / %
- ..
- = ~= < > <= >=
- und
niedrigste oder

Operationen mit der gleichen Priorität werden von links nach rechts (links assoziativ) ausgeführt, außer ^ und.., die von rechts nach links ausgeführt werden (rechts assoziativ). Daher wird a^b^c als a^ (b^c) ausgewertet.