1. ホーム
  2. スクリプト・コラム
  3. ルア

Luaステートメント入門

2022-02-11 04:22:24

Luaのステートメントは、代入、制御構造、関数呼び出し、変数宣言をサポートしています。

空のステートメントセグメントは許されないので、;は不正です。

1ステートメントグループ|チャンク

コピーコード コードは以下の通りです。

chunck ::= {stat[';']}

([';'] は、文群の後に ; を付けることが任意であることを示すものと思われます)。

2 ステートメントブロック|ブロック

コピーコード コードは以下の通りです。

block ::= chunck
stat ::= do block end

ステートメントのブロックをステートメントグループとして明示的に記述することで、ローカル変数のスコープを制御することができます。

3 アサイン|アサインメント

Luaは複数のアサインメントをサポートしています。

多重代入は、右辺の式の値を左辺の値の順に代入する。右側の値はnilで過小評価され、右側の値は破棄される。

コピーコード コードは以下の通りです。

b = 1
a,b = 4 -- a = 4,b = nil
+++

Luaが代入を行う場合、右辺の式を全て一度に計算してから代入を行います。

コピーコード コードは以下の通りです。

i = 5
i,a[i] = i+1, 7 -- i = 6 ,a[5] = 7

具体的には、以下のようなものがあります。

x,y = y,x -- x, yの値を交換する。
+++

グローバル変数やテーブルのフィールドへの代入操作の意味を、メタテーブルで変更できるようにした。

4 制御構造

4.1 条件文

コピーコード コードは以下の通りです。

if [exp]
    [block]
elseif [exp]
    [block]
else
    [block]
end

4.2 ループステートメント

コピーコード コードは以下の通りです。

while [exp]
    [block]
end
+++

repeat
    [block]
until [exp]

なお、repeat文はuntilで終わっていないので、ブロック内で定義したローカル変数はuntil以降の式で使用することができます。

コピーコード コードは以下の通りです。

a = 1
c = 5
repeat
    b = a + c
    c = c * 2
until b > 20
print(c) --> 40
+++

4.3 ブレーク&リターン

breakとreturnはブロックの最後にだけ書いてください。どうしてもブロックの途中で書く必要がある場合は、do endブロックをこの二つのキーワードで囲んでください。

do break end

5 Forループ

forループの使い方はいろいろあるので、分けて考えてみましょう。

forの中の式はループ開始前に一度だけ評価され、ループ中は更新されない。

5.1 数値形式

for [名前] = [exp],[exp],[exp] do [ブロック] end
3つのexpは、それぞれ初期値、終了値、ステップを表しています。
3番目のexpのデフォルトは1であり、省略可能である。

コピーコード コードは以下の通りです。

a = 0
for i = 1,6,2 do
    a = a + i
end

に相当します。

コピーコード コードは以下の通りです。

int a = 0;
for (int i = 1; i <= 6;i += 2){ // fetch the equal sign, if the step is negative, then it will take i >= 6
    a += i;
}

5.2 イテレータ形式

イテレータ形式で表を出力する場合、表の中に関数があると、出力の順番や数が不定になる(理由は不明ですが、テストしてみました)。

イテレータ形式におけるforループの本質

-- イテレータ、状態テーブル、イテレータの初期値を順に返します。

コピーコード コードは以下の通りです。

function mypairs(t)
    function iterator(t,i)
        i = i + 1
        i = t[i] and i -- if t[i] == nil then i = nil; otherwise i = i
        return i,t[i]
    end
    return iterator,t,0
end

-- テーブル
t = {[1]="1",[2]="2"}.

-- 繰り返し for 文の等価形

コピーコード コードは以下の通りです。

do
local f, s, var = mypairs(t)
    while true do
        local var1, var2 = f(s, var)
        var = var1
        if var == nil then break end

        -- statement added to the for loop
        print(var1,var2)

    end
end

-- 文の繰り返し形式

コピーコード コードは以下の通りです。

for var1,var2 in mypairs(t) do
    print(var1,var2)
end

--> 1 1
--> 2 2
--> 1 1
--> 2 2

5.2.1 配列形式

コピーコード コードは以下の通りです。

ary = {[1]=1,[2]=2,[5]=5}
for i,v in ipairs(ary) do
    print(v) --> 1 2
end

1から始まり、数値添え字が終わるか、値がnilになった時点で終了します。

5.2.2 テーブルトラバーサル

コピーコード コードは以下の通りです。

table = {[1]=1,[2]=2,[5]=5}
for k,v in pairs(table) do
    print(v) --> 1 2 5
end

キーと値のペアのテーブル全体を反復処理する。

イテレータの詳細については、Lua イテレータとジェネリックを参照してください。

この記事の内容は以上です。