表現
Luaのでは式は、数値定数、文字列定数、変数、単項およびバイナリ演算子、関数呼び出しを含んでいます。また、定義や非従来の構成テーブルを機能することができます。
算術演算子
バイナリ演算子:+ - * / ^(加算、減算パワー)
単項演算子: - (マイナス)
これらの演算子のオペランド実数です。
関係演算子
< > <= >= == ~=
オペレータは、結果が偽又は真で返し、二つの異なるタイプの値の場合==〜=両者が異なることのLUA、2つの値を比較し、自分自身だけとnilが等しいです。基準比較テーブル、ユーザーデータ、関数によってLUA。両方が同じオブジェクトに相当表す場合にのみ、その。
a = {}; a.x = 1; a.y = 0
b = {}; b.x = 1; b.y = 0
c = a
a==c but a~=b
Luaは、従来のデジタルコンパレータサイズ、アルファベット順に比較文字列で数字が、ローカル環境のアルファベット順に依存します。
有料特に注意の異なる型の値を比較する場合:
"0" == 0 -- false
2 < 15 -- true
"2" < "15" -- false (alphabetical order!)
混合数値や文字列を比較し、一貫性のない結果を回避するために、ルアは等、与えられる:2 <「15」
論理演算子
and or not
0は真で、他がtrueの場合、論理演算子はfalseを考慮し、nilは偽(false)にあります。
ANDとORの演算結果が真と偽のではなく、二つのオペランドとその関連します。
a and b -- 如果 a 为 false,则返回 a,否则返回 b
a or b -- 如果 a 为 true,则返回 a,否则返回 b
例えば:
print(4 and 5) --> 5
print(nil and 13) --> nil
print(false and 13) --> false
print(4 or 5) --> 4
print(false or 5) --> 5
A非常に実用的なヒント:xが偽かnilであれば初期値をx vに割り当てられています
x = x or v
等価に
if not x then
x = v
end
そしてまたはより高い優先度。
C言語の三項演算子
a ? b : c
Luaの中で達成することができます:
(AおよびB)またはCの
結果ではない、常にtrueまたはfalseを返します
print(not nil) --> true
print(not false) --> true
print(not 0) --> false
print(not not nil) --> false
オペレーターに参加
.. --两个点
オペランドがデジタルの場合は文字列の連結は、Luaのデジタル文字列に変換しました。
print("Hello " .. "World") --> Hello World
print(0 .. 1) --> 01
優先順位
降順:
^
not - (unary)
* /
+ -
..
< > <= >= ~= ==
and
or
また^ ...とすべてのバイナリ演算子は接続残されています。
a+i < b/2+1 <--> (a+i) < ((b/2)+1)
5+x^2*8 <--> 5+((x^2)*8)
a < y and y <= z <--> (a < y) and (y <= z)
-x^2 <--> -(x^2)
x^y^z <--> x^(y^z)
テーブルの構造
コンストラクタは、テーブルを作成し、初期化するための式です。Luaのテーブルには、ユニークな強力なものです。最も単純なコンストラクタ{}は、空のテーブルを作成します。直接配列を初期化します。
days = {"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"}
Luaの "日曜日" 初期設定日[1] "月曜日" の初期化日間で(最初の要素のインデックス1)、[2] ...
print(days[4]) --> Wednesday
コンストラクタは、任意の初期化式を使用することができます。
tab = {sin(1), sin(2), sin(3), sin(4),
sin(5),sin(6), sin(7), sin(8)}
あなたはレコードとしてテーブルを初期化したい場合は、この方法で使用することができます。
a = {x=0, y=0} <--> a = {}; a.x=0; a.y=0
かかわらず、我々はフィールドのいずれかのタイプを追加または削除ができる方法のテーブルを作成し、コンストラクタは、テーブルに初期化テーブルに影響を与えます。
w = {x=0, y=0, label="console"}
x = {sin(0), sin(1), sin(2)}
w[1] = "another field"
x.f = w
print(w["x"]) --> 0
print(w[1]) --> another field
print(x.f[1]) --> another field
w.x = nil -- remove field "x"
コンストラクタを呼び出すたびに、Luaが新しいテーブルを作成するには、リストを構築するために、テーブルを使用することができます。
list = nil
for line in io.lines() do
list = {next=list, value=line}
end
このコードは、各列に標準入力から読み取られ、その後、逆の順序でリンクされたリストを形成します。次のコードは、リストの内容を出力します。
l = list
while l do
print(l.value)
l = l.next
end
:同じコンストラクタにおいてそのようなものとして、混合し、レコードリストスタイルのスタイルの初期化であってもよいです
polyline = {color="blue", thickness=2, npoints=4,
{x=0, y=0},
{x=-10, y=0},
{x=-10, y=1},
{x=0, y=1}
}
私たちは巣のコンストラクタは、複雑なデータ構造を表現することができ、この例でも示しています。
print(polyline[2].x) --> -10
上記の制限機能を初期化する2つの構成が、たとえば、あなたがテーブル要素の文字列のインデックスが適切に表現できない初期化するために、負のインデックスを使用することはできません、があります。以下は初期化され、より一般的に説明し、我々は表示された[表現]を表現インデックスを初期化されます。
opnames = {["+"] = "add", ["-"] = "sub",
["*"] = "mul", ["/"] = "div"}
i = 20; s = "-"
a = {[i+0] = s, [i+1] = s..s, [i+2] = s..s..s}
print(opnames[s]) --> sub
print(a[22]) --> ---
リストスタイルの初期化とレコードスタイルの初期化は、この一般的な初期化の特殊なケースです。
{x=0, y=0} <--> {["x"]=0, ["y"]=0}
{"red", "green", "blue"} <--> {[1]="red", [2]="green", [3]="blue"}
あなたが本当に配列のインデックスにしたい場合は0から始まります:
days = {[0]="Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
注:お勧めできません配列の添字は、そうでない場合は、標準ライブラリの多くは使用できない、0から始まります。
最後の拡張子の後、「」それはすることができます簡単にコンストラクタのオプションです。
a = {[1]="red", [2]="green", [3]="blue",}
フィールド区切りカンマ(「」)におけるコンストラクタは( 『;』)セミコロンによって分離することができる代わりに、我々は、通常のテーブル要素の異なるタイプを分離するためにセミコロンを使用。
{x=10, y=45; "one", "two", "three"}