metatable


metatable とは userdata, table への演算に対してどの関数を呼び出すのかを 連想配列で表した表( テーブル )のこと。 データ型はテーブルと同じで、userdata, table と関連づけるだけの違い。


MetaMethod とは演算子を独自処理におきかえる


POINT [ 演算子 ]を独自処理におきかえる.( operator のこと ) MetaMethod を利用することで実現している. tbl の値取得, 関数呼び出しの値を変更することも可能. OO では [ 演算子を独自に定義できる ]ことが特徴. {"pos" , getPos() } <-> tbl 経由で呼び出す. ? { data, Evt=Func } の組を MetaTbl として にセットすることで Lua に通知する。


event の種類


-- MetaMethod
local data1 = { name="a", price=120} local data2 = { name="b", price=100} function add( op1, op2 ) return op1.price + op2.price; end -- data1 の加算 + には myAdd を利用するように登録 setmetatable( data1, { __add = add, ... } ) print( data1 + data2 );



Overload


POINT metatable はある値( Object )に対して, 特別な演算を overload する際に便利。 スレッド、関数、ユーザーデータ型のオブジェクトはメタテーブルをもつ。 { KEY == Event , 値 = MetaMethod } 使いどころ その値に対して特殊な処理をした際の, 挙動を定義する 数値以外の値が加算のオペランドになった ---> Luaはメタテーブルの "__add" フィールドをチェック 加算を行うためにその関数をcall Object のふるまいを定義する metatable は、算術演算、関係比較、連結、長さ演算子、インデックス付けについて オブジェクトがどう振る舞うかを制御する メタテーブルがコントロールできる演算を以下のとおり 各演算のキーは、その名前の前に2つのアンダースコア `__´ が付く文字列
__add, a + b の時にコールされる __sub, __mul, __div, __mod, __concat, __len __tostring print( a );
-- 配列に metatable を セットして, add を overload してみる
setmetatable( metatableをセットする値, {metatable}), metatable = {_add, 関数名 }



環境table


環境は table のひとつ. thread に関連つけられた環境は, global環境と呼ぶ.