确保表是一个类的对象?

时间:2018-01-28 09:55:12

标签: oop lua

我上课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的解决方案。但是,如果可能的话,我更喜欢没有它们的解决方案。这很困难,因为表中的任何变量都可以复制。

如何做到这一点?

2 个答案:

答案 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表的一部分。