変数


Lua には 3種類の変数がある。
[.] global [.] local [.] tablefield
データ( 情報 )はすべて, テーブルという構造に格納される。 グローバル変数はグローバル用のテーブルにセットされる。
-- local と言わなければ, global v = 10; -- local 宣言で local変数扱い local t = "test"; -- 値が代入されない変数は nil がセットされる。 local v;
POINT 変数に型はなく、任意の型のオブジェクトの場所だけを知っている存在。 動的にわりあてることができるが、 変数の型チェックをしてくれないため自前でする必要がある。 ( Perl, Python 同様 ) 静的わりつけ Merit 実行前に チェック 可能 効率のよい cmp 作成可能 DeMerit 頻繁な型変換 param が異なる場合に複数の関数が必要. 動的わりつけ Merit Object の型をしらべて, 処理をするという動的な処理が可能 DeMerit 実効時にエラーが発生 param が異なる場合に複数の関数が必要. ひとつの 変数(Symbol) に 文字列, 数値 を代入できる。 Java, C では変数に型情報があるため, 実行前にチェックができる。 スペルミスが素通りされる危険がある


ローカル変数


ローカル変数を定義するには local 文を使用する。
local i = 10; local i, j = 10, 20;
SYNTAX local name [= expression] local namelist [= expressionlist] POINT ブロック内で local 文を使用する度に, 新たに変数が定義される。 ( C 同様 ) C と同じでブロック内のスコープになる。
i = 20 -- グローバル変数 i do local i = 10 -- 変数 i do local i = 7 -- これは別オブジェクトの 変数 i -- 7 print (i) end -- もっとも内側のブロックで変数は消滅する -- 10 print (i) end
for i=1, 10 do local y; -- ここで新規定義 if y == nil then y = 0 else y = y + 1 end done



グローバル変数


すべてのグローバル変数は、Luaの環境テーブルというテーブル内のフィールドとして存在する。 global変数とテーブルフィールドへアクセスする効果はメタテーブルによって変えられる. 各関数はそれぞれ独自に環境への参照を持つ. 関数が作られたとき、関数は、それが作られた関数から見える環境を受け継ぐ( ENV 同様 x == _env.x == gettable_event(_env, "x") ( MetaMethod を利用する ) Lua で グローバル変数を宣言( 代入 )する際は, TblGbl( _G ) に格納される
mt = {}; mt.__newindex = function( t, n, v );
POINT block do ... end に属さない local v は file scope になる 保守性のために, local にすること.
-- 未定義変数のチェック if ( v ~= nil ) end