【问题标题】:Using 'Object' functions in Lua?在 Lua 中使用“对象”函数?
【发布时间】:2013-09-16 07:20:03
【问题描述】:

我希望能够在 Lua 中拥有具有某些引用自身的函数的“对象”(我不知道该怎么称呼它)。我已经看到了我正在尝试做的代码,但我从来没有理解它的实际含义。我试过查看 Lua 网站,但没有运气。

基本代码:

table = {}

function newTable(...)
  ...
  return setmetatable(table)
end

function table:funcName(...)
  ...
end

有人可以解释一下这里发生了什么以及我如何使用它吗?感谢阅读!

【问题讨论】:

标签: lua lua-table metatable


【解决方案1】:

missingno 已经提到了一个解释其工作原理的资源。您还可以查看lua wiki's OOP 部分以获取更多说明和示例。

简要总结您的示例,从如何使用它开始。请注意,我更改了一些名称,因此它不会影响 lua 附带的标准模块。通过调用newObject 创建一个新对象。您可以使用 : 后跟方法名称来调用该对象的方法:

-- create two instances
object1 = newObject()
object2 = newObject()

-- call 'my_function' method for object1
object1:my_function()

您需要对元表有所了解,才能了解这种机制在幕后是如何工作的。当您执行以下呼叫时:

object1:my_function()

这只是语法糖:

object1.my_function(object1)

这可以进一步细分为:

object1["my_function"](object1)

现在object1 只是newObject 返回的一个空表——它没有"my_function" 键。通常这会导致错误,因为您正在尝试调用nil 值。但是,您可以使用元表更改此行为。基本思想是设置__index 元方法以指向包含您的类方法的表:

object_table = {}
object_table.__index = object_table
function newObject(...)
  return setmetatable({}, object_table)
end

然后方法查找过程将如下所示:object1 -> table。如果object1 没有密钥,则接下来咨询table。如果table 具有该键,则返回关联的值。如果table 也没有它,则返回nil,因为table 没有元表。

使用此设置,您只需将方法名称和函数指定为该对象的键值对,即可“覆盖”特定对象实例的方法。

object2.my_function = function (...)
  -- do something different
end

【讨论】:

  • 您的帖子不错,但可能会产生误导,因为您使用 Lua 关键字 function 作为方法/函数名称和表键,这不起作用。我建议将其更改为 my_function 之类的名称或具有同等可读性的名称。
  • @LorenzoDonati 说得好,解释有点懒。
  • 我注意到现在,您还覆盖了标准的table 库,执行table={},也许更安全的meta_table={} 更好:-)
  • 我查看了 OOP 编程部分,它对我帮助很大!谢啦!在我阅读网页之前,您的教程也做了一个很好的大纲。
  • @8bitslime 很高兴它有帮助。
猜你喜欢
  • 2019-03-23
  • 2014-12-03
  • 1970-01-01
  • 2017-07-21
  • 2019-02-18
  • 2014-09-27
  • 1970-01-01
  • 2022-11-13
  • 2016-08-20
相关资源
最近更新 更多