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),
- 我可以创建一个新的 parent class。
- 每个 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。
确保您了解元表的实际工作原理。
我有一个主脚本如下。此脚本称为 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),
- 我可以创建一个新的 parent class。
- 每个 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。
确保您了解元表的实际工作原理。