我如何向表类型添加方法?

如何向表类型添加方法?我试图编写一种搜索表值的方法。到目前为止我有:

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)

有什么建议吗?

点赞
用户734069
用户734069

没有适用于所有表格的单一元表

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

对于这些内容,只需创建一个自由函数而不是“成员”函数即可。

并不是所有东西都需要使用: 之类的面向对象编程。

2012-05-28 03:38:37
用户107090
用户107090

你已经向table库添加了一个方法,但你没有给table的表t设置任何元表。tablet之间没有自动连接。

2012-05-28 03:38:53
用户221509
用户221509

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

如果你想要“扩展” t,以便能够访问 table 模块中的函数,你必须设置一个元表,其中 __index 指向 table 模块。我使用以下函数来方便地访问它:

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

然后可以按以下方式使用它(由于语法糖不需要括号):

t = T{'four', 'five', 'six'}
t:insert('seven')
print(t:contains('seven')) --> true
2012-05-28 07:02:14