如何向表类型添加方法?

7 lua metaprogramming

如何向表类型添加方法?我正在尝试编写一个搜索表值的方法.到目前为止我有.

function table:contains(value)
  for _, v in ipairs(self) do
    if v == value then return true end
  end
  return false
end
Run Code Online (Sandbox Code Playgroud)

然而,当我尝试做以下事情时.

t = {'four', 'five', 'six'}
t:contains('five')
Run Code Online (Sandbox Code Playgroud)

我收到了错误.

stdin:1: attempt to call method 'contains' (a nil value)
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Mic*_*man 8

正如有人说了,你t是一个简单的表,它仅包含下列键值对:[1]='four',[2]='five',[3]='six'.

如果要"扩展" t以便能够从table模块访问函数,则必须设置__index指向table模块的元表.我使用以下函数轻松访问它:

function T(t)
    return setmetatable(t, {__index = table})
end
Run Code Online (Sandbox Code Playgroud)

然后你可以按如下方式使用它(感谢语法糖,不需要括号):

t = T{'four', 'five', 'six'}
t:insert('seven')
print(t:contains('seven')) --> true
Run Code Online (Sandbox Code Playgroud)


Nic*_*las 5

没有所有表的单个元。与字符串和数字不同,每个表都有其自己的单独的元表。

只需为这些事情创建一个自由函数而不是一个“成员”函数即可。并不是所有的东西都必须都是面向对象的:

  • 没有表的* default *元表。 (3认同)