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環境と呼ぶ.