从YAML创建对象,已初始化常量

时间:2012-02-14 13:24:16

标签: ruby initialization constants iteration

两个问题,可能是相关的:

我正在从一个YAML文件中检索一些'人'到一个数组,现在我正在尝试从该数组创建类。

然后将这些对象放在一个新数组中。

如果您不考虑上次添加的对象替换之前添加的 all 这一事实,它确实很好。

在我的情况下,我得到五个相同的对象#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

人员级

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 个答案:

答案 0 :(得分:1)

你采用了错误的方法来填充你的Person类。你的循环唯一要做的就是创建全新的Person类并将它们粘贴在一个数组中。它实际上并没有初始化人员类。

看起来你要做的就是使用一个常量(你不保持常量)将信息传递给Person类。但是,Person类中除了方法之外的代码只会运行一次 - 当第一次加载类时,而不是在创建新Person时。

最好更改初始化方法以获取一些参数,并在循环中创建具有适当参数的类。

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

您似乎正在尝试为实例变量创建动态访问器。这并没有多大意义。只需在所有这些上定义访问器,并处理在调用Person类的任何代码中实例变量为nil的情况。