lua setmetatableと__についてindexの小さな例
1821 ワード
local _a1 = {20, 1, key1 = "hello", key2 = "world", lang = "lua"}
print("the table _a1:")
for _,v in pairs(_a1) do
print(v)
end
local _a2 = {
key1 = "hello new",
key2 = "world new"
}
print("
the old table _a2:")
for _,v in pairs(_a2) do
print(v)
end
print("
a2 metatable:",getmetatable(_a2))
print("language:",_a2["lang"])
-- __index
setmetatable(_a2, {__index = _a1})
print("
the new table _a2:")
for _,v in pairs(_a2) do
print(v)
end
print("
language:", _a2["lang"])
the table _a1: 20 1 hello lua world
the old table _a2: hello new world new
a 2のmetatable:nil language:nil
the new table _a2: hello new world new
language: lua
--配列は1から始まるハハprint("_a2配列の最初の要素:",_a2[1])print("_a2のmetatable:",getmetatable(_a2))
小贴士:
luaマニュアルを参照してください.metatableはメタテーブルとして翻訳され、Luaの各値にはmetatableが使用できます.このmetatableは、特定の操作における元の値の動作を定義するために使用される元のLua tableです.
1つのmetatableは、オブジェクトが数学演算操作、比較操作、接続操作、長さ取得操作、スケールダウン操作を行うときの動作を制御し、metatableではuserdataをゴミ収集時に呼び出す関数を定義することもできます.これらの操作に対して、Luaは、前のイベントと呼ばれる指定健に関連付けられる.Luaがこれらの操作のいずれかを開始する必要がある場合、値のmetatableに対応するイベントがあるかどうかを確認します.もしあるならば、キー名の対応する値(メタメソッド)はLuaがどのようにこの操作をするかを制御します.
metatableは、次のような特殊な操作を含む関数によって、接続されているtableに定義します.
__add:保留中のtableの加算操作を定義する_mul:乗算操作の定義_div:除算操作の定義_sub:減算操作の定義_unm:負の操作を定義します.すなわち、-tableの意味_tostring:tableがtostring()関数のパラメータとして呼び出されたときの動作(例えばprint(table)を定義するときにtostring(table)を出力結果として呼び出す)_concat:接続操作を定義します("."演算子)_index:tableに存在しないkey値を取得しようとしたときの動作を定義する_newindex:tableで新しいkey値を生成するときの動作を定義する
転載先:https://www.cnblogs.com/byfei/archive/2013/01/04/3112354.html