Lua とmetatablesに関する初心者向けの質問です。Hello ‑World のように単純な例で、len
イベントに関係していますが、残念ながら期待される結果が返されません (Ubuntu の公式リポジトリからインストールされた Lua 5.1 を使用しています)。
ケース
次に例を示します。
Test_Type = {};
function Test_Type.__len (o)
return 1;
end;
function new_test ()
local result = {};
setmetatable(result, Test_Type);
return result;
end;
do
local a_test = new_test();
print (#a_test);
print(getmetatable(a_test).__len(a_test));
end;
そして、私が得る結果:
0
1
最初の print ステートメントで が表示されることを期待していましたが、驚いたことに1
が表示されます。0
私は何を逃したのですか?
Lua Reference Manual — Metatables and Metamethodsによると、#
これは次のようになります。
function len_event (op)
if type(op) == "string" then
return strlen(op) -- primitive string length
else
local h = metatable(op).__len
if h then
return (h(op)) -- call handler with the operand
elseif type(op) == "table" then
return #op -- primitive table length
else -- no handler available: error
error(···)
end
end
end
だからprint (#a_test);
、print(getmetatable(a_test).__len(a_test));
同じ結果になるはずですよね?
ところで、上記のリファレンス マニュアルからの抜粋が参照されmetatable(op)
ているはずなのに、なぜ参照されているのgetmetatable(op)
でしょうか。少なくとも試してみましprint(metatable(a_test).__len(a_test));
たが、エラーになります。
答え
Nneonneoが気付いたように、これは使用中の Lua バージョンの問題です。上記が動作するにはLua 5.2が必要なようです。