2015-01-13 54 views
0

這裏是我的代碼:未定義的方法'身份證」的零:NilClass的對象集合

class Train 
    attr_accessor :id, :person_id, :movie_id, :eval 
    def initialize(id, person_id, movie_id, eval) 
    @id = id 
    @person_id = person_id 
    @movie_id = movie_id 
    @eval = eval 
    end 
end 

trains = Array.new 
CSV.open('train.csv', encoding: "BOM|UTF-16LE:UTF-8", row_sep: :auto, col_sep: ';') do |csv| 
    csv.each do |id, person_id, movie_id, eval| 
    trains[id.to_i] = Train.new(id.to_i, person_id.to_i, movie_id.to_i, eval.to_i) 
    end 
end 

trains.each do |t| 
    puts t.id 
end 

它只是從一個CSV文件創建對象的數組,並打印對象的ID,但我得到錯誤:

undefined method `id' for nil:NilClass 

爲什麼t爲零,當我使用puts t正在打印的對象。

+0

好吧,我發現它,第一個元素(列車[0])是零... – tommybernaciak

+1

歡迎來到堆棧溢出。請花些時間閱讀[格式化文本的幫助](http://stackoverflow.com/editing-help)。閱讀和理解越容易,我們可以幫助您越快越好。 –

回答

0

您正在初始化數組,然後通過指定索引來添加到trains數組。如果您的csv中的id從1開始(或101),那麼通過您的第一個索引將被初始化爲零。

嘗試使用trains <<而不是trains[id.to_i]來填充陣列。

編輯:

鑑於您的評論,我建議使用散列代替。它們仍然是可枚舉的,但通過這種方式,您可以自由迭代並使用該id作爲可訪問的索引(鍵)。

trains = Hash.new 
CSV.open('train.csv', encoding: "BOM|UTF-16LE:UTF-8", row_sep: :auto, col_sep: ';') do |csv| 
    csv.each do |id, person_id, movie_id, eval| 
    trains[id.to_i] = Train.new(id.to_i, person_id.to_i, movie_id.to_i, eval.to_i) 
    end 
end 

所以,現在你有一列火車與火車ID作爲關鍵的散列。訪問它仍然看起來像一個數組,但它會返回該對象。因此trains[5]將返回Train對象的ID爲5.

我認爲這是一個更好的解決方案,比使用一堆nils數組。但是,如果你要出於某種原因,只是使用條件後在迭代(儘管這是真的尷尬):

trains.each do |t| 
    puts t.id if t 
end 

在Ruby中,只有false和nil都是「falsey」,意思是評估爲假所以這會得到你想要的。但爲了方便起見,我真的推薦使用哈希路線。

+0

是的,這就是我在評論中給出的,我發現第一個元素是零。你的解決方案可能是好的,但我想用id來選擇每個列車,例如,如果我想用id 5獲得一個列車,我只是使用列車[5]。在你的解決方案中,它不會以這種方式工作。無論如何,感謝您的幫助。 :) – tommybernaciak

+0

我已經編輯了答案,爲您提供了一種不同的存儲類型,可以實現您用ID編制索引的目標。散列在這裏會更好用。 – cdownard

+0

是的,的確,在大多數情況下,散列會好得多,在我需要數組的情況下,但它是特定情況。 – tommybernaciak

相關問題