式
式は変数とリテラル値から値を計算します。
- 算術演算
- リレーショナルオペレーション
- ロジカルオペレーション
- 連結
- 長さ
- 優先順位
算術演算
算術演算は数値に対して実行されます。文字列値を算術演算に使用すると、数値に変換されます。変換に失敗すると、エラーが返されます。
| a + b | a と b を追加 |
| a-b | a から b を引く |
| a * b | a と b を掛ける |
| a/b | a を b で割る |
| a% b | modulo = a - math.floor(a/b)*b |
| a ^ b | a を b 乗する。b には任意の数を指定できる |
| -a | 否定する |
リレーショナルオペレーション
関係演算は 2 つの値を比較し、関係が満たされている場合は true を返し、そうでない場合は false を返します。リレーショナル操作は、どのタイプの値でも実行できます。値が同じタイプでない場合は、false が返されます。数値は通常の方法で比較されます。文字列は、現在のロケールの照合順序を使用して比較されます。
| a == b | a は b と等しい |
| a ~= b | a は b と等しくない |
| a < b | a は b より小さい |
| a > b | a は b より大きい |
| a <= b | a が b と等しいか、それより小さい |
| a >= b | a が b より大きいか、または等しい |
ロジカルオペレーション
論理演算は従来、ブール値に対して実行されていましたが、この言語では任意の2つの値に対して実行できます。nilとfalseはfalseと見なされ、その他の値はtrueと見なされます。論理演算ではショートカット評価を使用します。最初の値が操作の結果を決定する場合、2 番目の値は評価されません。
| a と b | a が false または nil の場合は a を返し、それ以外の場合は b を返します。 |
| a or b | a が false ではなく nil でもない場合は a を返し、それ以外の場合は b を返します。 |
| not a | a が false でないか nil の場合は false を返し、それ以外の場合は true を返します |
andおよびor演算は、式内の条件付き評価に使用できます。
| a or b | a が初期化されていない (nil) 場合は、これを使用してデフォルト値 b を指定できます。これは関数のオプションパラメータに役立ちます。 |
| a と b または c | 条件 a に基づいて、nil 以外の b または c を選択できます。a が true の場合、a と b は b を返し、b または c は b を返します。a が false の場合、a と b は false を返し、false または c は c を返します。これは? と同等です。b: C プログラミング言語の c。 |
連結
文字列の連結は s1.. s2 です。これにより、s1 と s2 の内容を保持するのに十分な大きさの新しい文字列が作成され、その内容が新しい文字列にコピーされます。s1 または s2 が文字列でない場合、エラーが発生します。連結を繰り返すと、かなりのコピーオーバーヘッドが発生する可能性があることに注意してください。一度に 1 バイトずつ連結して n バイトの文字列を作成すると、n* (n+1) /2 バイトがコピーされます。パフォーマンスを向上させるには、文字列の一部を連結してテーブル (後述) に入れ、table.concat () 関数を使用できます。この例が COMBINE_HEADERS () の例に示されています。
長さ
文字列 s の長さは #s によって返されます。#演算子は、後で説明するように、配列テーブルでも使用されます。
優先順位
演算子の優先順位によって、式で実行される演算の順序が決まります。優先順位の高い操作は、優先順位の低い操作より先に実行されます。優先順位は通常どおり、括弧で上書きできます。たとえば、in a + b \* c, * は+よりも優先順位が高いため、 a + (b \* c)式は次のように評価されます。
| 最高 | |
| - | not # - (unary) |
| - |
|
| - | .. |
| - | = ~= < > <= >= |
| - | 変更前 |
| 最低 | または |
同じ優先順位の演算は左から右 (左連想) に実行されますが、^ と.. は右から左 (右連想) に実行されます。したがって、^ b ^ cはa^(b ^ c)として評価されます。