Lua 変数
変数は使用前に、コード内で宣言する必要があります。つまり、その変数を作成することです。
コンパイラはコードを実行する前に、文の変数に値を格納するための記憶域をどのように確保するかを知る必要があります。
Lua の変数には3つの型があります:グローバル変数、ローカル変数、テーブルのフィールドです。
Lua の変数はすべてグローバル変数です。文ブロックや関数内であっても、local で明示的にローカル変数として宣言しない限りは。
ローカル変数のスコープは、宣言された位置から、そのブロックの終わりまでです。
変数のデフォルト値はすべて nil です。
例
-- test.lua スクリプトファイル
a = 5 -- グローバル変数
local b = 5 -- ローカル変数
function joke()
c = 5 -- グローバル変数
local d = 6 -- ローカル変数
end
joke()
print(c,d) --> 5 nil
do
local a = 6 -- ローカル変数
b = 6 -- ローカル変数に再代入
print(a,b); --> 6 6
end
print(a,b) --> 5 6
a = 5 -- グローバル変数
local b = 5 -- ローカル変数
function joke()
c = 5 -- グローバル変数
local d = 6 -- ローカル変数
end
joke()
print(c,d) --> 5 nil
do
local a = 6 -- ローカル変数
b = 6 -- ローカル変数に再代入
print(a,b); --> 6 6
end
print(a,b) --> 5 6
上記の例を実行すると、出力結果は次のようになります:
$ lua test.lua 5 nil 6 6 5 6
代入文
代入は、変数の値を変更し、テーブルのフィールドを変更するための最も基本的な方法です。
a = "hello" .. "world" t.n = t.n + 1Lua は複数の変数に同時に代入できます。変数リストと値リストの各要素はカンマで区切ります。代入文の右側の値は順に左側の変数に代入されます。
a, b = 10, 2*x <--> a=10; b=2*x
代入文の場合、Lua はまず右側のすべての値を計算し、その後に代入操作を実行します。そのため、次のようにして変数の値を交換できます:
x, y = y, x -- swap 'x' for 'y' a[i], a[j] = a[j], a[i] -- swap 'a[i]' for 'a[j]'
変数の数と値の数が一致しない場合、Lua は常に変数の数を基準として次の戦略をとります:
a. 变量个数 > 值的个数 按变量个数补足nil b. 变量个数 < 值的个数 多余的值会被忽略
例
a, b, c = 0, 1
print(a,b,c) --> 0 1 nil
a, b = a+1, b+1, b+2 -- value of b+2 is ignored
print(a,b) --> 1 2
a, b, c = 0
print(a,b,c) --> 0 nil nil
print(a,b,c) --> 0 1 nil
a, b = a+1, b+1, b+2 -- value of b+2 is ignored
print(a,b) --> 1 2
a, b, c = 0
print(a,b,c) --> 0 nil nil
上記の最後の例はよくある間違いのケースです。注意:複数の変数に代入する場合は、各変数に順番に代入する必要があります。
a, b, c = 0, 0, 0 print(a,b,c) --> 0 0 0
多値代入は、変数の交換や、関数呼び出しの戻り値を変数に代入するためによく使われます:
a, b = f()
f() は2つの値を返し、最初の値は a に、2番目の値は b に代入されます。
できるだけローカル変数を使用するべきです。2つの利点があります:
- 1. 名前の衝突を避けられます。
- 2. ローカル変数へのアクセスはグローバル変数よりも高速です。
インデックス
テーブルのインデックスには角かっこ [] を使用します。Lua は . 演算子も提供しています。
t[i] t.i -- 当索引为字符串类型时的一种简化写法 gettable_event(t,i) -- 采用索引访问本质上是一个类似这样的函数调用
例
> site = {}
> site["key"] = "www.example.com"
> print(site["key"])
www.サンプル.com
> print(site.key)
www.サンプル.com
> site["key"] = "www.example.com"
> print(site["key"])
www.サンプル.com
> print(site.key)
www.サンプル.com