Ausdrücke

Ausdrücke berechnen Werte aus Variablen- und Literalwerten.

  • Arithmetische Operationen
  • Relationale Operationen
  • Logische Operationen
  • Verkettung
  • Testdauer
  • Rangfolge

Arithmetische Operationen

Arithmetische Operationen werden an Zahlenwerten ausgeführt. Wenn ein Zeichenfolgenwert in einer arithmetischen Operation verwendet wird, wird er in eine Zahl umgewandelt. Schlägt dies fehl, wird ein Fehler zurückgegeben.

   
a+b füge a und b hinzu
a-b subtrahiere b von a
a* b multipliziere a und b
a/b teile a durch b
a% b modulo = a - math.floor (a/b) *b
a^b erhöhe a zur b-Potenz; b kann eine beliebige Zahl sein
-a negiere ein

Relationale Operationen

Relationale Operationen vergleichen zwei Werte und geben wahr zurück, wenn die Beziehung erfüllt ist, und falsch, wenn sie nicht erfüllt ist. Relationale Operationen können zwischen Werten beliebigen Typs ausgeführt werden. Wenn die Werte nicht vom gleichen Typ sind, wird false zurückgegeben. Die Zahlen werden auf die übliche Weise verglichen. Zeichenketten werden anhand der Sortierreihenfolge 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 als oder gleich b

Logische Operationen

Logische Operationen werden traditionell mit booleschen Werten ausgeführt, aber in dieser Sprache können sie mit zwei beliebigen Werten ausgeführt werden. nil und false werden als falsch betrachtet und jeder andere Wert wird als wahr angesehen. Logische Operationen verwenden Abkürzungen. Wenn der erste Wert das Ergebnis der Operation bestimmt, wird der zweite Wert nicht ausgewertet.

   
a und b wenn a falsch oder nil ist, dann gib a zurück, sonst gib b zurück
a oder b wenn a nicht falsch und nicht nil ist, dann gib a zurück, sonst gib b zurück
nicht ein wenn a nicht falsch oder nil ist, gib false zurück, sonst gib 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 b oder c zu wählen, die nicht Null sind, basierend auf der Bedingung a. 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. Das entspricht einem? b: c in der Programmiersprache C.

Verkettung

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

Testdauer

Die Länge einer Zeichenfolge s wird von #s zurückgegeben. Der Operator # wird auch bei Array-Tabellen verwendet, wie später beschrieben.

Rangfolge

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

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

Operationen mit derselben Priorität werden von links nach rechts (linksassoziativ) ausgeführt, mit Ausnahme von ^ und.., die von rechts nach links ausgeführt werden (rechtsassoziativ). Daher wird a^b^c als a^ (b^c) ausgewertet.

Ausdrücke