入門Luaプログラミング第7章 Luaの仕組み(後編)

眠くてできなかった部分、多値を返す関数やレキシカルスコープなどについて。あとコラムの高階関数も。

多値を返す関数

代入時に","で区切って同時に代入したり、変数同士を入れ替えたり。

> a, b = 1, 2
> print(a)
1
> print(b)
2
> a, b = b, a
> print(a)
2
> print(b)
1


多値を返す関数を宣言して使ってみる。

> function a(str)
>>   return string.upper(str), #str
>> end
> b, c = a("abcdef")
> print(b)
ABCDEF
> print(c)
6

多値で返ってきた!
Scalaだと……タプルにあたるのかな?

レキシカルスコープ

実を言うとレキシカルスコープという言葉は知っていても、どういう意味なのか知らなかったり。


えーと、変数のスコープ範囲のことなのかな。

> function abc()
>>   local qqq = 1
>>   function def()
>>     local www = 2
>>     print(qqq)
>>     print(www)
>>   end
>>   def()
>>   print(qqq)
>>   print(www)
>> end
> abc()
1
2
1
nil

変数wwwはdef関数の中で宣言されてるのでabc関数の後ろにあるprint(www)はnilになってるというか。……この理解であってるのかな。

高階関数

loadstringで戻ってきた関数をそのまま実行。

> loadstring("print(123)")()
123


ということはクロージャも…?

> function a()
>>   local i = 1
>>   return function()
>>     print(i)
>>     i = i + 1
>>   end
>> end
> q = a()
> q()
1
> q()
2
> q()
3

おおー、クロージャだ。


これにて第7章終わり。ほかの章より少し長かった。