Создание объектов из YAML, уже инициализированная константа - PullRequest
0 голосов
/ 14 февраля 2012

Две проблемы, которые, вероятно, связаны:

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

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

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

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

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

Я получаю множество предупреждений, касающихся «повторного использования» констант: 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

Persons-class

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 Ответ

1 голос
/ 14 февраля 2012

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

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

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

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

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

...