キーの存在をチェックするカスタムcontainsメソッドをLuaのデータ構造に作成したいと思います。table
使用法は次のようになります。
mytable = {}
table.insert(mytable, 'key1')
print(mytable.contains('key1'))
ありがとう。
キーの存在をチェックするカスタムcontainsメソッドをLuaのデータ構造に作成したいと思います。table
使用法は次のようになります。
mytable = {}
table.insert(mytable, 'key1')
print(mytable.contains('key1'))
ありがとう。
Luaでは、すべてのテーブルを一度に変更することはできません。これは、数値、文字列、関数などのより単純なタイプで行うことができ、メタテーブルを変更して、すべての文字列、すべての関数などにメソッドを追加できます。これは、文字列に対してLua 5.1ですでに行われているため、これが可能です。これ:
local s = "<Hello world!>"
print(s:sub(2, -2)) -- Hello world!
テーブルとuserdataには、インスタンスごとにメタテーブルがあります。すでに存在するカスタムメソッドを使用してテーブルを作成する場合、単純なテーブルコンストラクターでは実行できません。ただし、Luaのシンタックスシュガーを使用すると、次のようなことができます。
local mytable = T{}
mytable:insert('val1')
print(mytable:findvalue('val1'))
これを実現するには、使用する前に次のように記述する必要がありますT
。
local table_meta = { __index = table }
function T(t)
-- returns the table passed as parameter or a new table
-- with custom metatable already set to resolve methods in `table`
return setmetatable(t or {}, table_meta)
end
function table.findvalue(tab, val)
for k,v in pairs(tab) do
-- this will return the key under which the value is stored
-- which can be used as a boolean expression to determine if
-- the value is contained in the table
if v == val then return k end
end
-- implicit return nil here, nothing is found
end
local t = T{key1='hello', key2='world'}
t:insert('foo')
t:insert('bar')
print(t:findvalue('world'), t:findvalue('bar'), t:findvalue('xxx'))
if not t:findvalue('xxx') then
print('xxx is not there!')
end
--> key2 2
--> xxx is not there!