在Lua中使用“Object”函数?

我想在 Lua 中拥有具有指向自身的特定函数的“对象”(我不知道该如何称呼它)。我已经看到了我尝试做的代码,但我从来没有真正理解过它的含义。我已经尝试查看 Lua 网站,但没有运气。

基本代码:

table = {}

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

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

有人能解释一下这里正在发生什么,以及我如何使用它吗?谢谢您的阅读!

点赞
用户234175
用户234175

missingno已经提到了一个解释这个工作方式的资源。您还可以查看 lua维基的OOP 部分,了解更多解释和示例。

简要总结您的示例,从如何使用它开始。请注意,我更改了一些名称,以便不影响与lua一起提供的标准模块。通过调用 newObject 来创建新对象。您可以使用 : 、方法名称来调用该对象的方法:

-- 创建两个实例
object1 = newObject()
object2 = newObject()

-- 为 object1 调用 'my_function' 方法
object1:my_function()

您需要了解有关元表(metatable)的一些内容,以了解这个机制背后的工作原理。当您像这样进行调用时:

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 (...)
  -- 做一些不同的事情
end
2013-09-15 06:55:11