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