2012-02-14 3 views
0

Две проблемы, которые, вероятно, связаны:Создание объектов из YAML, уже инициализирован постоянные

Я retreiving ряд «лиц» из в YAML-файла в массив, и теперь я пытаюсь создать классов из этого массива.

Эти объекты затем помещаются в новый массив.

Это действительно работает отлично, если вы не считаете, что добавленный последний объект заменяет все ранее добавленным.

В моем случае я получаю пять идентичных копий объекта № 5, где мне очень хочется увидеть пять разных.

Я полагаю, что ошибка приводит к тому, что ошибка в моем итераторе приводит к получению всех «лиц» из YAML.

Я получаю cuople предупреждений относительно «повторного использования» констант: NEWSTR и NEWAL.

getPost = 0 
loopa = 0 

    while loopa < personsInYAML 
     NEWSTR = TEST.fetch(getPost) 
     NEWAL = NEWSTR.split(' ') 
     getPost+=1 

     puts "*****************************************" 
     nyloop = loopa+1 
     puts "PERSON: " + nyloop.to_s + " name: " + NEWAL.fetch(1) 

     nameToArray = Person.new 
     outputArray.insert(loopa, nameToArray) 
     loopa+=1 
    end 

Лица-класса

class Person 

    def initialize 
     @name 
     @age 
     @length 
     @weight 
     @misc 
    end 


    def name 
     name = NEWAL.fetch(1) 
     return name 
    end 

    if NEWAL.include?("age:") 

     def age 
      x = NEWAL.index("age:")+1 
      age = NEWAL.fetch(x) 
      return age 
     end 
    end 

    if NEWAL.include?("length:") 
     def length 
      x = NEWAL.index("length:")+1 
      length = NEWAL.fetch(x) 
      return length 
     end 
    end 

    if NEWAL.include?("weight:") 
     def weight 
      x = NEWAL.index("weight:")+1 
      weight = NEWAL.fetch(x) 
      return weight 
     end 
    end 

    if NEWAL.include?("misc:") 
     def misc 
      x = NEWAL.index("misc:")+1 
      misc = NEWAL.fetch(x) 
      return misc 
     end 
    end 
end 

ответ

1

Вы принимаете неправильный подход к заполнению вашего класса Person. Единственное, что делает ваша петля, это создать совершенно новые классы Person и вставить их в массив. На самом деле это не инициализация класса человека вообще.

Похоже, что вы пытаетесь использовать константу (которую вы не сохраняете постоянной) для передачи информации классу Person. Однако код, который у вас есть в вашем классе Person, который находится вне методов, будет запускаться только один раз - когда класс загружается в первый раз, а не в то время, когда вы создаете нового человека.

Вам будет лучше сменить метод инициализации, чтобы принять некоторые аргументы, и создать класс с соответствующими аргументами в цикле.

def initialize(name, age = nil, length = nil, weight = nil, misc = nil) 
    # assign instance variables here 
    @name = name 
    ... 
end 

Возможно, вы пытаетесь создать динамические аксессоры для переменных экземпляра. Это не имеет большого смысла. Просто определите accessors на всех из них и обработайте случай, когда переменные экземпляра равны нулю в любом коде, вызывающем класс Person.

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