Lua:如何在所有表上创建自定义方法

我想在 Lua 的 table 数据结构上创建一个自定义的 contains 方法,以检查是否存在指定的键。使用方法类似于:

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

谢谢。

点赞
用户221509
用户221509

在 Lua 中,你无法一次性更改所有表。你可以在更简单的类型上操作元表并添加一个方法到所有字符串、所有函数等简单类型上。这已经在 Lua 5.1 中针对字符串已经实现,这就是为什么你可以这样做的示例:

local s = "<Hello world!>"
print(s:sub(2, -2)) -- Hello world!

表和用户数据具有每个实例的元表。如果你想要创建一个包含自定义方法的表,一个简单的表构造器就行不通了。不过,使用 Lua 的语法糖,你可以这样做:

local mytable = T{}
mytable:insert('val1')
print(mytable:findvalue('val1'))

为了实现这个,你需要在使用 T 之前编写以下东西:

local table_meta = { __index = table }
function T(t)
    -- 返回参数表或一个新表
    -- 设置自定义元表,以便在 "table" 中解析方法
    return setmetatable(t or {}, table_meta)
end

function table.findvalue(tab, val)
    for k,v in pairs(tab) do
        -- 这将返回存储该值的键,可以用作布尔表达式以确定值是否包含在表中
        if v == val then return k end
    end
    -- 隐式返回空值
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-01 10:04:24