3

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が必要なようです。

4

1 に答える 1

6

http://lua-users.org/wiki/LuaFaqから:

__gcおよび__lenメタメソッドがテーブルで機能しないのはなぜですか?

__lenonテーブルは5.2でサポートされる予定です。LuaFiveTwoを参照してください。

5.1を使用しているため、__lenテーブル上では機能しません。実際、Lua5.2でコードを実行すると

1
1

予想通り。

于 2012-10-07T06:08:38.900 に答える