2012-05-04 5 views
0

私はそれが次のコードをやって動作させることができます知っているが、これは読んでタイプするのは非常に痛いです:Ruby:Structからハッシュ要素を変更しますか?

def changer 
    @animals[ "birds" ][2] = "Raven" 
    @animals[ "birds" ][3] = "Spoonbill" 
    display 
end 

def display 
    puts "...#{@animals[ "birds" ][2]}, #{@animals[ "birds" ][3]}." 
end 

@animals = Hash.new 
@animals[ "birds" ] = [ "Cardinal", "Bluejay", "Ostrich", "Flamingo" ] 
puts @animals[ "birds" ][2] # => Ostrich 
puts @animals[ "birds" ][3] # => Flamingo 
changer 

は、どのように私はそれがこのような多くを見えるようにすることができますか? (残念ながら、変数を引数として渡すことはできません)

Animals = Struct.new(:red, :blue, :black, :pink) 

def changer 
    @b.black = "Raven" 
    @b.pink = "Spoonbill" 
    display 
end 

def display 
    puts "New birds are #{@b.red}, #{@b.blue}, #{@b.black}, #{@b.pink}." 
    # definitely unchanged still... => New birds are Cardinal, Bluejay, Ostrich, Flamingo. 
end 

@animals = Hash.new 
@animals[ "birds" ] = [ "Cardinal", "Bluejay", "Ostrich", "Flamingo" ] 
@b = Animals.new(*@animals[ "birds" ]) 
puts @b.black # => Ostrich 
puts @b.pink # => Flamingo 
changer 

ご協力いただきありがとうございます。

編集:これは私が今までに思い付いたベスト(作業中の)コードです。警告:それはかなりではありません。

Animals = Struct.new(:red, :blue, :black, :pink) 

def changer 
    b = Animals.new(*@animals[ "birds" ]) 
    b.black = "Raven" 
    b.pink = "Spoonbill" 
    @animals[ "birds" ][2] = b.black 
    @animals[ "birds" ][3] = b.pink 
    display 
end 

def display 
    b = Animals.new(*@animals[ "birds" ]) 
    puts "New birds are #{b.red}, #{b.blue}, #{b.black}, #{b.pink}." 
end 

@animals = Hash.new 
@animals[ "birds" ] = [ "Cardinal", "Bluejay", "Ostrich", "Flamingo" ] 
b = Animals.new(*@animals[ "birds" ]) 
puts b.black # => Ostrich 
puts b.pink # => Flamingo 
changer 

答えて

0

問題の理由は、あなたがすべての方法で新しいAnimalオブジェクトを作成し、あなたが最初に作成したものを中心に渡していないです。 Animalインスタンスは、animal['birds']ハッシュの内容に基づいてゼロから作成されます。その内容はもちろん変更されません。

おそらく、animalsをインスタンス変数として作成するのではなく、ローカル変数として作成することを意味しています。@は省略してください。

+0

ありがとう、私はそれが元のハッシュからユニークだったことをかなり気付かなかった。あなたが提案したように、私は議論を周りに伝えます。 – rubyuser1357796

+0

注意する必要がある他の微妙な点があることに注意してください。例えば、 'changer'は、何かを表示するメソッド(' display'を呼び出します)の良い名前ではないかもしれません。 –

+0

動物がインスタンス変数である理由は、引数を渡すことができないメソッドによってアクセスする必要があるためです。チェンジャーに "b"を渡すコードをよく見てからb Structが定義されていない別のメソッドから呼び出されてから動作します。基本的には、あまりにも多くの場所からこのハッシュへの書き込みアクセスが必要です。スクリプトの複数のインスタンスが一度に実行されているため、個々のインスタンス変数が動作しなくなります。 – rubyuser1357796

関連する問題