入門Luaプログラミング第2章 処理の流れ

昨日に続いて今夜は第2章へ進みます。制御構文や配列などの章です。

if文と比較演算子

if文は"if 〜 then"と表記します。PascalRubyのようです。まあ、Rubyはthenを省略できますが。

> a = 1
> if a == 1 then
>>   print('a is 1')
>> end
a is 1


C言語などで"else if"と表記するところは"elseif"とつなげて書きます。

> if (a < 0) then
>>   print('a less than 0')
>> elseif (a == 0) then
>>   print('a is 0')
>> else
>>   print('a more than 0')
>> end
a more than 0


比較演算子は以下の通りです。~=だけ見慣れませんがC言語などの!=です。

<   >   <=   >=   ~=   ==

while文とbreak文

while文は"while 〜 do"と表記します。

> b = 1
> while (b < 5) do
>>   print(b)
>>   b = b + 1
>>   if (b > 3) then
>>     break
>>   end
>> end
1
2
3

ちなみに標準のLuaにはcontinue文が無いそうで……

for文

for文は"for 変数名 = 初期値, 最終値[, 増分] do"と表記します。
増分を省略した場合はカウンタ変数が1づつ増加します。

> for index = 1, 3 do
>>   print(index)
>> end
1
2
3


増分を2つにしたfor文です。

> for index = 1, 4, 2 do
>>   print(index)
>> end
1
3


3から始まって-1ずつ増加するfor文です。

> for index = 3, 1, -1 do
>>   print(index)
>> end
3
2
1


増分を省略して、初期値が最終値より大きい場合はループしません。

> for index = 3, 1 do
>>   print(index)
>> end

repeat - until文

C言語などのdo - while文に相当するものです。if - thenといい、この文といい、所々Pascal似です。
少し癖があるといえば、untilに指定した条件がtrueの場合にループを抜けることでしょうか……

> i = 1
> repeat
>>   print(index)
>>   i = i + 1
>> until (i > 5)
1
2
3
4
5

do - while文と同じく、必ず1度はループする文ですね。

配列

配列とかいいながら実は連想配列――テーブルらしいですが……
ただし、キーに当たる部分を数値にしておくことで高速に処理してくれるとかなんとか。

> q = {}
> q[1] = 123
> q[5] = "aaa"
> for i = 1, 5 do
>>   print(q[i])
>> end
123
nil
nil
nil
aaa

1行目で空の配列を作ったあとは、好きな位置に値を代入できます。
間の開いた何も代入されていない部分はnilが初期値になります。
ちょっと違和感のあるところと言えば、添字が0でなく1から始まるところでしょうか……


初期値に値の入った配列を代入する場合は、フィールド名のないテーブルのような感じで記述します。

> r = {"a", "b", "c", "d", "e"}
> for i = 1, 5 do
>>   print(r[i])
>> end
a
b
c
d
e


配列はtable.getn関数を使うと要素数が取得できます。

> t = {1,2,3}
> print(table.getn(t))
3
> print(table.getn({'あ'}))
1
> print(table.getn({nil,nil}))
0
> print(table.getn({nil,nil,""}))
3

論理値と論理演算子(and, or, not)

論理値にはtrueとfalseの2つがあります。真と偽ですね。
Luaではfalseとnil以外は真を表します。空文字や0は偽とはみなされません。うっかりしてはまってしまいそうです。


論理演算子のand, or, notはそれぞれ&&, ||, !でしょうか。
orを使うと変数にデフォルト値を代入できます。

a = b or 1

変数bに値が入っている場合(falseとnil以外)は変数bの値を、そうでない場合は1が変数aに代入されます。
JavaScript界隈などで見かける、以下のような記述と同じです。

var a = b || 1;  // bが偽に判定される場合1が代入される

FizzBuzz

せっかくなのでこれまでの知識でFizzBuzzを書いてみましょー。

for i = 1, 100 do
  fizz = (i % 3 == 0)
  buzz = (i % 5 == 0)
  if (fizz and buzz) then
    print("fizzbuzz")
  elseif (fizz) then
    print("fizz")
  elseif (buzz) then
    print("buzz")
  else
    print(i)
  end
end

あまり美しくないコードですが……


以上、入門Luaプログラミング第2章でした。