Luaノート--文法
3440 ワード
Luaは「多重代入」を許可し、すなわち複数の値を一気に複数の変数に与える.各値または各変数はカンマで区切られます.
多重代入では、Luaは、等号の右側にあるすべての要素を評価してから、代入を実行します.
Luaは常に等号の右の値の個数を左の変数の個数と一致するように調整します.ルールは、値の個数が変数の個数より少ない場合、余分な変数がnilに割り当てられます.値の個数が多ければ、余分な値は「静かに」捨てられる.
多重代入は一般的にはあまり使用されませんが、2つの変数と関数を収集するための複数の戻り値を交換する場合に有効です.例えば、a,b=f()であり、関数fは2つの値を返し、aは1番目を受信し、bは2番目を受信する.
「ローカル変数をできるだけ使用」は、優れたプログラミングスタイルです.ローカル変数は、不要な名前をグローバル環境に導入することを回避し、グローバル環境を混乱させないようにします.また、ローカル変数へのアクセスは、グローバル変数へのアクセスよりも高速です.最後に、ローカル変数は通常、その役割ドメインの終了とともに消失し、ゴミ収集器が値を解放できるようにします.
Luaでは、次のような書き方をする習慣があります.
このコードは、ローカル変数fooを作成し、すべての変数fooの値で初期化します.後続の他の関数がグローバルfooの値を変更した場合、ここで値を保存できます.この方法は、fooへの現在の役割ドメインへのアクセスを加速させることもできる.
Luaはswitch文をサポートしていないので、if then elseif else endコードの一連は一般的です.
Whileの場合、Luaはまず条件をテストし、条件が偽の場合、ループは終了し、そうでない場合、Luaはループを実行し、このプロセスを繰り返します.
repeat-until文は、条件が真の場合に終了するまでループを繰り返します.テストは循環体の後に行われるので、循環体は少なくとも1回実行されます.
他のほとんどの言語とは異なり、Luaでは、ループ内のローカル変数を宣言する役割ドメインに条件テストが含まれています.
for文には、数値型forと汎用型forの2つの形式があります.
数値型forの構文は次のとおりです.
varはexp 1からexp 2に変化し、変化するたびにexp 3をステップとしてvarをインクリメントし、「実行体」を1回実行する.3番目の式exp 3はオプションで、指定しないとLuaはステップ長を1にデフォルト設定します.
制御変数はfor文のローカル変数として自動的に宣言され、ループ内でのみ表示されることに注意してください.したがって,制御変数はループ終了後には存在しない.ループ終了後に制御変数の値(通常はbreakループ時)にアクセスする必要がある場合は、その値を別の変数に保存する必要があります.
汎用forループは、反復器(iterator)関数を使用してすべての値を巡回します.
Luaのベースライブラリは、配列を巡る反復関数であるipairsを提供します.各ループにおいて、iはインデックス値を付与され、vはインデックスに対応する配列要素値を付与される.
break文は、外側層のループを変更することなく、その内部ループ(for、repeat、またはwhile)を含むループのみをスキップするループを終了するために使用されます.breakを実行すると、プログラムはそのジャンプされたループの後に実行されます.
return文は、1つの関数から結果を返すか、1つの関数の実行を簡単に終了するために使用されます.任意の関数の末尾に暗黙的なreturnがあります.
a, b = 10, 2*x
多重代入では、Luaは、等号の右側にあるすべての要素を評価してから、代入を実行します.
x, y = y, x --> x y
Luaは常に等号の右の値の個数を左の変数の個数と一致するように調整します.ルールは、値の個数が変数の個数より少ない場合、余分な変数がnilに割り当てられます.値の個数が多ければ、余分な値は「静かに」捨てられる.
多重代入は一般的にはあまり使用されませんが、2つの変数と関数を収集するための複数の戻り値を交換する場合に有効です.例えば、a,b=f()であり、関数fは2つの値を返し、aは1番目を受信し、bは2番目を受信する.
「ローカル変数をできるだけ使用」は、優れたプログラミングスタイルです.ローカル変数は、不要な名前をグローバル環境に導入することを回避し、グローバル環境を混乱させないようにします.また、ローカル変数へのアクセスは、グローバル変数へのアクセスよりも高速です.最後に、ローカル変数は通常、その役割ドメインの終了とともに消失し、ゴミ収集器が値を解放できるようにします.
i = 10 -->
local j = 2 -->
Luaでは、次のような書き方をする習慣があります.
local foo = foo
このコードは、ローカル変数fooを作成し、すべての変数fooの値で初期化します.後続の他の関数がグローバルfooの値を変更した場合、ここで値を保存できます.この方法は、fooへの現在の役割ドメインへのアクセスを加速させることもできる.
Luaはswitch文をサポートしていないので、if then elseif else endコードの一連は一般的です.
if op == "+" then
r = a + b
elseif op == "-" then
r = a - b
elseif op == "*"
r = a * b
elseif op == "/"
r = a / b
else
error("invalid operation")
end
Whileの場合、Luaはまず条件をテストし、条件が偽の場合、ループは終了し、そうでない場合、Luaはループを実行し、このプロセスを繰り返します.
local i = 1
while a[i] do
print(a[i])
i = i + 1
end
repeat-until文は、条件が真の場合に終了するまでループを繰り返します.テストは循環体の後に行われるので、循環体は少なくとも1回実行されます.
--
repeat
line = io.read()
until line ~= ""
print(line)
他のほとんどの言語とは異なり、Luaでは、ループ内のローカル変数を宣言する役割ドメインに条件テストが含まれています.
local sqr = x/2
repeat
sqr = (sqr + x/sqr) / 2
local error = math.abs(sqr^2 - x)
until error < x/10000 --> error
for文には、数値型forと汎用型forの2つの形式があります.
数値型forの構文は次のとおりです.
for var=exp1, exp2, exp3 do
< >
end
varはexp 1からexp 2に変化し、変化するたびにexp 3をステップとしてvarをインクリメントし、「実行体」を1回実行する.3番目の式exp 3はオプションで、指定しないとLuaはステップ長を1にデフォルト設定します.
制御変数はfor文のローカル変数として自動的に宣言され、ループ内でのみ表示されることに注意してください.したがって,制御変数はループ終了後には存在しない.ループ終了後に制御変数の値(通常はbreakループ時)にアクセスする必要がある場合は、その値を別の変数に保存する必要があります.
汎用forループは、反復器(iterator)関数を使用してすべての値を巡回します.
-- a --( ipairs)
for i, v in ipairs(a) do
print(v)
end
Luaのベースライブラリは、配列を巡る反復関数であるipairsを提供します.各ループにおいて、iはインデックス値を付与され、vはインデックスに対応する配列要素値を付与される.
-- table t key --( table pairs)
for k in pairs(t) do
print(k)
end
break文は、外側層のループを変更することなく、その内部ループ(for、repeat、またはwhile)を含むループのみをスキップするループを終了するために使用されます.breakを実行すると、プログラムはそのジャンプされたループの後に実行されます.
return文は、1つの関数から結果を返すか、1つの関数の実行を簡単に終了するために使用されます.任意の関数の末尾に暗黙的なreturnがあります.
mytable = {2, 4, k="ok", ctable={}, 6}
--
for i=1, #mytable do
print(mytable[i])
end
-- ,
for i,v in ipairs(mytable) do
print(i,v)
end
-- , , table
for k,v in pairs(mytable) do
print(k,v)
end
-- :
2
4
6
1 2
2 4
3 6
1 2
2 4
3 6
k ok
ctable table: 0x7f84094097f0
s = "ok"
table = {k = 10} --k
table[s] = 12
print(table["k"]) -->10
print(table.k) -->10
print(table[s]) -->12
a = 'a dshkf \\ * sd'
print(string.format("%q",a) -->''a dshkf \\ * sd''
--%q