如何向表类型添加方法?

时间:2012-05-28 02:39:21

标签: lua metaprogramming

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

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

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

t = {'four', 'five', 'six'}
t:contains('five')

我收到了错误。

stdin:1: attempt to call method 'contains' (a nil value)

有什么建议吗?

3 个答案:

答案 0 :(得分:7)

正如其他人所说,您的t是一个简单的表格,它只包含以下键值对:[1]='four'[2]='five'[3]='six'

如果要“扩展”t以便能够从table模块访问函数,则必须设置一个指向{{1}的__index的元表。模块。我使用以下函数轻松访问它:

table

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

function T(t)
    return setmetatable(t, {__index = table})
end

答案 1 :(得分:4)

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

为这些事情做一个免费的功能而不是“成员”功能。并非一切都需要:等所有OOP。

答案 2 :(得分:3)

您已向table库添加了一个方法,但尚未向表t提供任何元表。 tablet之间没有自动连接。