2012-02-14 65 views
0

兩個問題,這可能是相關的:從YAML創建的對象,已初始化恆

我retreiving一批從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 

人級

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類中的方法以外的代碼只會運行一次 - 當這個類第一次加載時,而不是在你創建一個新的Person的時候。

你最好改變你的initialize方法來接受一些參數,並在循環中用適當的參數創建類。

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

您似乎嘗試爲實例變量創建動態訪問器。這並沒有太多意義。只要在它們全部定義訪問器,並處理實例變量在任何代碼調用Person類時都爲零的情況。