今回はfunction OnFrame〜endを以下のように書きかえる
function OnFrame() if true then out(0, "1"); end if false then out(1, "2"); end if 1 then out(2, "3"); end if 0 then out(3, "4"); end if "さばとたん" then out(4, "さばとたん"); end if "" then out(5, "かわいい"); end if nil then out(6, "nil"); end variable = 1; if variable then out(7, "variable"); end if sabato then out(9, "sabato"); end end
if文を用いることで一定の条件(キーが押されたとか)によってLuaの実行内容を切り替えられる。 if文は、「if 値 then」の書式で実行する条件を記述し、then〜endの間に条件を満たした場合に実行する内容を記述する。 上の例では説明のために多くの場合で値の部分に変数ではなく値をそのまま入れているが、通常は無意味なのでやらない。 条件については後述
「if 値 then」の書式においてifとthenの間にある値をこのifの条件や条件式という。そして、条件の値がnilとfalse以外のあらゆる値であればthen〜endの内容が実行され、条件の値がnilかfalseであったときだけスキップする。 実行する場合、"if文の条件を満たした"といい、スキップする場合は"条件を満たさなかった"という。
今度はfunction OnFrame〜endを以下のように書きかえる
function OnFrame() if true then out(0, "true"); else out(0, "not true"); end if false then out(1, "true"); else out(1, "false"); end if 1 == 2 then out(2, "1==2"); elseif 1 < 2 then out(2, "1 < 2"); end if 3 == 1 then out(3, "3 == 1"); elseif 3 == 2 then out(3, "3 == 2"); elseif 3 == 3 then out(3, "3 == 3"); end if 2 == 0 then out(4, "2==0"); elseif 2 == 1 then out(4, "2==1"); elsd out(4, "others"); end end
上記のように、"if 値 then〜end"の構文の"then〜end"の部分に"else"を加えることによって、 「条件を満たした場合に実行する部分」をthen〜elseの前までに限定し、 一方で「条件が満たされなかった場合」にelse〜endの部分が実行されるようにできる。 また、elseではなく、 elseif 値 thenとすることで、「条件が満たされなかった場合」に 再び条件を判断して処理を分岐することができる。elseifの場合も条件についてはifの条件と同じである。 elseifはいくつでも記述可能で、その場合ifを含めて上から順に条件を見ていき、1つでも条件を満たされれば そこの内容を実行し、対応するendまでのelseif文やelse文はすべてスキップする。そして、1つも条件が満たされなかった場合は、もしあればelseの内容を実行する。
if 条件1 then if文の内容 elseif 条件2 then --elseif文1 elseif文1の内容 elseif 条件3 then --elseif文2 elseif文2の内容 以下elseif文を気が済むまで並べる .... else else文の内容 end
ただし、elseif文はいくつでも書くことができるが、else文は1つ書くか、もしくは書かないかしかない。 後、各文の順番は、elseよりあとにelseifがあってはならない。
今度はfunction OnFrame〜endを以下のように書きかえる
function OnFrame() if true then if false then out(1, "true"); else out(1, "false"); end if 1 then out(0, "true"); else out(0, "false"); end else if 1 then out(0, "true"); else out(0, "false"); end if false then out(1, "true"); else out(1, "false"); end end end
上記のようにif文の中にはまた別のif文を書くことができる。その場合、当然ながら外側のif文の条件を満たさなければ内側はそもそも実行されない。 また、if文の条件が満たされなかった場合にスキップされるのはあくまでも"対応するend(かelseif,else)"までなので、 上記
if true then if false then out(1, "true"); else--上のifでのスキップはここまで out(1, "false"); end if 1 then out(0, "true"); else out(0, "false"); end else--ここまで飛んできたりはしない
において"if false then"でスキップされるのは直後のelseまでであり、外側のif文のelseではない。