在Lua中使用“对象”功能?

时间:2013-09-15 03:46:01

标签: lua lua-table metatable

我希望能够在Lua中使用某些引用自己​​的功能(我不知道该怎么称呼)的'对象'。我已经看到了我正在尝试做的代码,但我从未理解它的实际意义。我试过查看Lua网站,但没有运气。

基本代码:

table = {}

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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

你需要了解一些关于metatables的知识,以了解这种机制在幕后的运作方式。当您执行以下呼叫时:

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