2

キーの存在をチェックするカスタムcontainsメソッドをLuaのデータ構造に作成したいと思います。table使用法は次のようになります。

mytable  = {}
table.insert(mytable, 'key1')
print(mytable.contains('key1'))

ありがとう。

4

1 に答える 1

8

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!
于 2012-10-01T10:04:24.920 に答える