8

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

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)

有什么建议么?

4

3 回答 3

8

正如其他人所说,您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-28T07:02:14.827 回答
7

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

只需为这些事情创建一个免费函数而不是“成员”函数。并非所有内容都需要全部为 OOP:等。

于 2012-05-28T03:38:37.623 回答
3

您已向table库中添加了一个方法,但您没有为 table 提供任何元表ttable和之间没有自动连接t

于 2012-05-28T03:38:53.807 回答