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
ありがとう、私はそれが元のハッシュからユニークだったことをかなり気付かなかった。あなたが提案したように、私は議論を周りに伝えます。 – rubyuser1357796
注意する必要がある他の微妙な点があることに注意してください。例えば、 'changer'は、何かを表示するメソッド(' display'を呼び出します)の良い名前ではないかもしれません。 –
動物がインスタンス変数である理由は、引数を渡すことができないメソッドによってアクセスする必要があるためです。チェンジャーに "b"を渡すコードをよく見てからb Structが定義されていない別のメソッドから呼び出されてから動作します。基本的には、あまりにも多くの場所からこのハッシュへの書き込みアクセスが必要です。スクリプトの複数のインスタンスが一度に実行されているため、個々のインスタンス変数が動作しなくなります。 – rubyuser1357796