2016-02-06 2 views
1

У меня есть основной сценарий следующим образом. Этот скрипт называется script.lua (для данного примера)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()) 

У меня есть еще один класс с именем 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 

и у меня есть третий класс, условие, которое следующим

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. Я могу создать новый родительский класс.
  2. Каждый родительский класс может иметь несколько условий (ака вопросы).

Для меня первая часть работает. Тем не менее, я терпеть неудачу со второй частью. Всякий раз, когда я запускаю скрипт, я получаю два экземпляра второго вопроса. Для получения дополнительной информации см. Снимок ниже.

enter image description here.

В идеале, я бы хотел, чтобы оба условия отображались ("are you happy?" и "are you sad?"), но в настоящее время это не так.

Не могли бы вы помочь мне с этим?

+0

Возможно, вы должны использовать 'local o = o или {}'. – lhf

+0

аргументы функции являются локальными по своей природе. o = o или {} в порядке! – Piglet

ответ

1

Посмотрите на конструкторе

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 

Everytime вы называете это изменить значение Condition.question и Condition.answer как само относится к Condition, не к новому объекту O!

Итак, что вы на самом деле делаете, это создать 2 новые таблицы condition1 и condition2, которые не имеют собственных .answer и .question. Поэтому вы получаете доступ к их метатему состоянию, которое после создания условия2 содержит: «Вам грустно?» , «НЕТ»)

Если вы хотите инициализировать элементы в своем конструкторе, вы должны использовать o.answer и o.question.

Удостоверьтесь, что вы понимаете, как работает этот метаматериал.

+0

спасибо Пятачок .. это сработало .. и да, я должен узнать больше о метатегах. еще раз спасибо. – Gagan

 Смежные вопросы

  • Нет связанных вопросов^_^