2012-04-04 86 views
1

當我運行下面的代碼我收到此錯誤:未定義的方法'藝術家」的零:NilClass(NoMethodError)

#!/usr/bin/env ruby -rubygems 
require File.join(File.dirname(__FILE__), 'authentication') 
require "csv" # faster_csv (ruby 1.9) 

lines = CSV.read(File.join(File.dirname(__FILE__), 'karaoke.csv')) # Exported an Excel file as CSV 
lines.slice!(0) # remove header line 
collection = StorageRoom::Collection.find('collection ID') 
Song = collection.entry_class 
lines.each do |row| 
    karaoke = Song.new(:artist => row[0], :song => row[1], :genre => row[2], :file => StorageRoom::File.new_with_filename("#{karaoke.artist}#{karaoke.song}.mov")) 
    if karaoke.save 
    puts "Misuero Karaoke Latino saved: #{karaoke.artist}, #{karaoke.song}, #{karaoke.genre}" 
    else 
    puts "Misuero Karaoke Latino could not be saved: #{karaoke.errors.join(', ')}" 
    end 
end 

和錯誤是:

import_csv.rb:15:in `block in <main>': undefined method `artist' for nil:NilClass (NoMethodError) 
    from import_csv.rb:14:in `each' 
    from import_csv.rb:14:in `<main>' 

我感興趣瞭解爲何出現此錯誤以及解決方案。提前致謝!

+1

它看起來像你的'卡拉OK'對象沒有實例化。 – 2012-04-04 12:20:59

+0

@AdrienSchuler我不明白。它是不是在15行中實例化?歌曲在12行中被實例化了嗎?或者我錯過了什麼? – hanleyhansen 2012-04-04 12:25:17

+2

您不能在您的卡拉OK對象構造函數中直接使用'StorageRoom :: File.new_with_filename(「#{karaoke.artist}#{karaoke.song} .mov」)'。當他尚未實例化時,您正嘗試訪問對象屬性。 – 2012-04-04 12:28:39

回答

5

看15行(import_csv.rb:15告訴你在哪裏尋找這個問題):

karaoke = Song.new(:artist => row[0], :song => row[1], :genre => row[2], 
    :file => StorageRoom::File.new_with_filename("#{karaoke.artist}#{karaoke.song}.mov")) 

在您使用karaoke.artistkaraoke.song來建構你Song:file部分賦值表達式的右側部分,但karaoke變量尚未初始化(它出現在左側)。事實上Ruby解釋器定義karaoke變量,當它看到賦值運算符,並開始賦值表達式的右側部分的評價(以初始化變量)和失敗的,因爲定義變量nil價值。

1

這意味着您是在零主叫藝術家方法/空

可能嘗試與#替換#{karaoke.artist}#{karaoke.song} {行[0]}#{行[1]} )

karaoke = Song.new(:artist => row[0], :song => row[1], :genre => row[2], :file => StorageRoom::File.new_with_filename("#{row[0]}#{row[1]}.mov")) 
+1

請注意,即使我首先回答您可能想要重新回答由誰提出問題,因爲其他答案更徹底。 – 2012-04-04 12:36:48

+0

這真的很想你!我去做。 – hanleyhansen 2012-04-04 12:39:06

2

看起來問題在於你指定了karaoke變量。當您將任何內容分配給新變量時,分配的右側將在左側之前計算。所以,在你的代碼到達第15行的時候,karaoke變量是nil

因此,當您在方法StorageRoom::File.new_with_filename中使用karaoke變量時,它是一個nil對象。 karaoke在分配的整個右側被計算之前不包含任何東西。然後它綁定到karaoke變量。

您應該考慮使用類似row[0]row[2]而不是karaoke.artistkaraoke.genre

1

在初始化本身時,您不能使用卡拉OK對象。

在當寫紅寶石(假設你從未使用「一」可變之前)

a = some_expression_or_value 

解釋計算「右部」,這是一些表達或值,然後受讓人的值它的變量。您之前沒有使用您的變量卡拉OK,這意味着它的值爲零。這就是爲什麼你會得到這個錯誤。

相關問題