Lua 向 table 插入记录失败

Lua inserting a record to a table is failing

我有一个主脚本如下。此脚本称为 script.lua(为了这个示例)

require "modules\myparentclass"
require "modules\condition"
require "modules\helpers"
require "constants"

parentclass = MyParentClass:new()
print ("MyParentClass Type : " .. parentclass:getCode())

-- add conditions

-- condition 1
condition1 = Condition:new(nil,"Are you happy?" , "YES")
parentclass:addCondition(condition1)

-- -- condition 2
condition2 = Condition:new(nil,"Are you sad?" , "NO")
parentclass:addCondition(condition2)


local l = parentclass:getConditions()

print(l[2]:getQuestion())

我还有一个class叫MyParentClass,代码如下

require "constants"
require "modules\condition"
require "modules\helpers"

-- Meta class
MyParentClass = {code = ""}


function MyParentClass:new (o)
   o = o or {}
   setmetatable(o, self)
   self.__index = self
   self.condition = condition
   self.conditions = {}
   return o
end

function MyParentClass:getCode ()
   return "Parent Class"
end

function MyParentClass:addCondition(condition)
    print(condition)
    table.insert(self.conditions,condition)
    print('record inserted')
    -- self.conditions = {next= self.conditions, value = condition}
end

function MyParentClass:getConditions()
    return self.conditions
end

我还有第三个class,条件如下

require "constants"


-- Meta class
Condition = {question="", answer=""}

function Condition:new (o, question,answer)
   o = o or {}
   setmetatable(o, self)
   self.__index = self
   self.question = question or nil 
   self.answer = answer or nil
   return o
end


function Condition:getCode ()
   return CONDITION_TYPE
end

function Condition:getQuestion()
    return self.question
end

function Condition:getAnswer() 
    return self.answer
end

思路是在主脚本中(script.lua),

  1. 我可以创建一个新的 parent class。
  2. 每个 parent class 可以有多个条件(又名问题)。

对我来说,第一部分很有效。但是我在第二部分失败了。每当我 运行 脚本时,我都会得到第二个问题的两个实例。有关详细信息,请参阅下面的快照。

理想情况下,我希望同时显示两个条件("are you happy?""are you sad?"),但目前情况并非如此。

你能帮我解决这个问题吗?

看看你的构造函数

function Condition:new (o, question,answer)
   o = o or {}
   setmetatable(o, self)
   self.__index = self
   self.question = question or nil 
   self.answer = answer or nil
   return o
end

每次调用它时,您都会更改 Condition.question 和 Condition.answer 的值,因为 self 指的是 Condition,而不是您的新对象 o!

所以您实际做的是创建 2 个新表 condition1 和 condition2,它们都没有自己的 .answer 和 .question。因此,您可以访问他们的元表 Condition,在您创建 condition2 后,该条件包含: "Are you sad?" , "NO")

如果要在构造函数中初始化成员,则必须使用 o.answer 和 o.question。

确保您了解元表的实际工作原理。