2016-05-27 18 views
0

私は未定義のメソッドを持っています。未定義メソッド `<< 'for nil:NilClass(NoMethodError)

rb:31:in `add_song': undefined method `<<' for nil:NilClass (NoMethodError) 

私は@library[artist]nilを与えることを理解しないが、私は理由を理解していないと、それを修正する方法がわかりません。何かアドバイス?

module Promptable 
    def prompt(message = "What music would you like to add", symbol = ":>") 
    print message 
    print symbol 
    gets.chomp 
    end 
end 


class Library 
    attr_accessor :artist, :song 
    def initialize 
    @library = {} 
    end 

    def add_artist(artist) 
    @library[artist] = [] 
    end 

    def add_song(song) 
    @library[artist] << song 
    end 

    def show 
    puts @library 
    end 
end 

class Artist 
    attr_accessor :name, :song 

    def initialize(artist) 
    @name = artist[:name] 
    @song = artist[:song] 
    end 

    def to_s 
    "#{name}, #{song}" 
    end 
end 


if __FILE__ == $PROGRAM_NAME 
    include Promptable 
    include Menu 
    my_library = Library.new 
    my_library.add_artist(Artist.new(:name => prompt("What it the artist name ?"))) 
    my_library.add_song(Artist.new(:song => prompt("What is the song name ?"))) 
    my_library.show 
end 

答えて

2

あなたは別とArtistadd_songの1つのインスタンスでadd_artistを呼んでいます。 add_songのアーティストの曲のリストを@library[artist]で検索すると、リストを保存したハッシュキー(Artistの最初のインスタンス)と同じではないハッシュキー(Artistの2番目のインスタンス)を使用しています。あなたは戻ってリストを取得していないが、nil

Artistの2つの異なるインスタンスを同等のハッシュキーとして使用するには、Artistの2つのインスタンスが等しい場合、implement eql? and hash appropriatelyのインスタンスを決定する必要があります。

関連する問題