Lua插入记录到表失败

我有一个主脚本如下。这个脚本称为script.lua(出于本例的目的)

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

parentclass = MyParentClass:new()
print ("MyParentClass类型 :" .. parentclass:getCode())

--添加条件

--条件1
condition1 = Condition:new(nil,"你开心吗?","是的")
parentclass:addCondition(condition1)

--条件2
condition2 = Condition:new(nil,"你伤心吗?","不")
parentclass:addCondition(condition2)

local l = parentclass:getConditions()

print(l[2]:getQuestion())

我有另一个名为MyParentClass的类,其代码如下

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

--元类
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 "父类"
end

function MyParentClass:addCondition(condition)
    print(condition)
    table.insert(self.conditions,condition)
    print('记录插入')
    -- self.conditions = {next= self.conditions, value = condition}
end

function MyParentClass:getConditions()
    return self.conditions
end

我有第三个类,Conditions,其代码如下

require "constants"

-- 元类
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. 我可以创建一个新的父类。
  2. 每个父类可以有多个条件(也称为问题)。

对我来说,第一部分正在工作。但是我在第二部分中失败了。每当我运行脚本时,我会得到第二个问题的两个实例。请参阅下面的快照以获取更多详细信息。

输入图像说明

理想情况下,我想同时显示两个条件(“你开心吗?”“你伤心吗?”),但目前情况并非如此。

您可以帮助我吗?

点赞
用户2858170
用户2858170

请看一下你的构造函数:

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!

因此,你实际上创建了两个新的表 condition1 和 condition2,它们都没有自己的 .answer 和 .question。因此,你访问它们的元表 Condition,其中在创建 condition2 之后包含:“你伤心吗?”,“否”)

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

确保你理解元表的工作原理。

2016-02-06 10:36:24