【问题标题】:how to create Lua methods that work with tables automatically如何创建自动处理表的 Lua 方法
【发布时间】:2020-12-03 07:55:06
【问题描述】:

在 Lua 中,我看到了一些方法,例如 stringio 类,它们允许您自动从表中调用方法,而无需为此实例化对象,例如:

以下代码:

local tb = {"Hello", "World!"}

table.concat(tb)

可以这样写:

local tb = {"Hello", "World!"}

tb:concat()

我试图创建一个可以做同样事情的方法:

local tst = {}

function tst:test()
     print("test")
end

但以下代码不起作用:

local tb = {"Hello", "World!"}

tb:test()

只有当我通知代码tb = tst:

local tb = tst

tb:test()

我的问题是,我有什么方法可以像第二个示例那样自动创建处理字符串或表的方法,而无需实例化类?比如,把我的表称为表:MyMethod()

【问题讨论】:

  • tb:concat() 不能开箱即用。你需要给tb一个元表。
  • @lhf 我应该如何创建这个元表?比如,我应该使用什么样的元方法来实现这一点?
  • __index,Lua 有一本很棒的手册,我建议你读一读。 Programming in Lua: 13.4.1 – The __index Metamethod也相关16.1 Classes
  • 你在什么 lua 环境下工作?您是否尝试过将方法添加到table
  • 你总是必须实例化一个对象才能调用它的方法。字符串是用字符串文字实例化的。文件用io.open 实例化。表用{} 实例化,另外你必须给它们一个元表来提供方法。

标签: class methods lua lua-table


【解决方案1】:

我不确定这是否回答了您最初的问题,但也许从 cmets 回答您的问题将有助于解释事情。

以下代码是一个示例,说明如何使用一些方法实例化一个表。

local function makeArray()
  local a = {}
  setmetatable(a, {__index = table})
  return a
end

setmetatable 调用基本上使 table 库中的所有函数都可以从新数组访问。这很有用,因为除了pack 之外的所有table 函数都期望一个数组作为它们的第一个参数。

Vanilla Lua 对字符串做了类似的事情。所有字符串都有{__index = string} 作为它们的元表。

【讨论】:

  • 太好了,感谢您的回答table 类是如何检测到local set = {} 是它的一个实例吗?也就是我们声明变量的时候table怎么理解{}实例化table,或者" "实例化string
  • table 不是一个类,它对其他表一无所知。关键是对象需要知道在哪里可以找到它的方法。在上面的代码中,setmetatablea 本身上存储了对table 的引用。如果您执行a:concat() 之类的操作,a 可以使用对table 的引用来查找concat 函数。请注意,local set = {} 没有元表,set 没有方法。至于字符串,它们与表的不同之处在于它们只有一个适用于整个数据类型的元表。
【解决方案2】:

虽然代码可以缩短,但卢瑟是正确的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 2016-11-03
    • 2016-01-19
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    相关资源
    最近更新 更多