【问题标题】:Creating objects from YAML, already initialized constant从 YAML 创建对象,已初始化常量
【发布时间】:2012-02-14 13:24:16
【问题描述】:

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

我正在从 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

【问题讨论】:

    标签: ruby initialization constants iteration


    【解决方案1】:

    您在填充 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 类的任何代码中处理实例变量为零的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 2011-12-29
      • 1970-01-01
      相关资源
      最近更新 更多