【问题标题】:How do I add a method to the table type?如何将方法添加到表类型?
【发布时间】:2012-06-02 11:25:49
【问题描述】:

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

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)

有什么建议吗?

【问题讨论】:

  • 请注意,table.contains(t, 'five') 确实有效。所以问题归结为:instance:method(...)type.method(instance, ...)有什么区别,这也让我很困惑here

标签: lua metaprogramming


【解决方案1】:

正如其他人所说,您的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

【讨论】:

    【解决方案2】:

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

    只需为这类事情创建一个免费函数而不是“成员”函数。并非所有内容都需要使用: 等都是面向对象的。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-20
        • 1970-01-01
        • 2012-08-21
        • 2015-05-26
        相关资源
        最近更新 更多