ローカルスコープについて
luaの挙動の話は前回でおしまいの予定だったが、補足が2件ほどあった。ひとつめがローカルスコープと関数の扱い。
local 宣言について先週は「そこで新たにローカルスコープを作る」というタイプの表現をしたが、どちらかというと、「ある種の操作では自動的にローカルスコープが作られる」「local宣言でローカルスコープに変数を追加する」とする方がより素直な理解なのかも(実装はこれから)。
具体的な「ローカルスコープを積むもの」は、
- do 〜 end
- 関数
ところで、「local宣言されない初出の変数は自動的にグローバルな領域の変数とみなす」という限定がある。このため、たとえば、
function acm() x = 0 return(function () x = x + 1; return x; end) end
のようにアキュムレータを作ると、
inc = acm() print(inc()) ---> 0 print(inc()) ---> 1 x = 10 print(inc()) ---> 11
のようになる。これを避けるには明示的に local 宣言をする。
function acm() local x = 0 return(function () x = x + 1; return x; end, function () x = x - 1; return x; end) end