我上课Apple
Apple.lua
function apple_new()
local self = { }
local size = 1
function self.grow()
size = size + 1
end
function self.size()
return size
end
return self
end
如果参数function(table)
最初是由函数true
创建的,我想定义table
,返回apple_new
。我目前还没有找到一种方法来确保假苹果'无法在该函数中返回true
。
AppleTest.lua
function is_apple(table)
if type(table) ~= "table" then return false end
return table.grow ~= nil and table.size ~= nil
end
local x = apple_new()
local y = { size = function() end, grow = function() end }
is_apple(x) -- true
is_apple(y) -- true, but it's a fake apple
我相信使用__metatable
metame方法存在metatables的解决方案。但是,如果可能的话,我更喜欢没有它们的解决方案。这很困难,因为表中的任何变量都可以复制。
如何做到这一点?
答案 0 :(得分:2)
在Apple.lua
中,添加此
local Apples = { }
setmetatable(Apples, {__mode = "k"})
function apple_new()
local self = { }
Apples[self] = true
...
return self
end
function is_apple(table)
return Apples[table] == true
end
要允许对苹果进行垃圾回收,您需要将Apples
设为弱表。
答案 1 :(得分:1)
如果要实现继承和类函数,也可以按照Programming In Lua中的方式执行。
Apple = {}
Apples = {}
function Apple:new (initTable)
local a = initTable or {}
table.insert (Apples, a)
setmetatable (a, self)
self.__index = self
return a
end
现在,您为Apple定义的任何功能都可用于您使用Apple:new功能创建的任何对象。创建时所有Apple将自动成为Apples表的一部分。