0

次のコードを実行して機能させることができることはわかっていますが、これを読んだり入力したりするのは非常に困難です。

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
4

1 に答える 1

0

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

animalsおそらく、インスタンス変数としてではなく、ローカル変数として作成するつもりもありませんでした@

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

def changer(animal)
  animal.black = "Raven"
  animal.pink = "Spoonbill"
  display animal
end

def display(animal)
  puts "New birds are #{animal.red}, #{animal.blue}, #{animal.black}, #{animal.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 b
于 2012-05-04T17:41:19.080 に答える