Ruby:从Struct修改哈希元素?

Ruby:从Struct修改哈希元素?,ruby,Ruby,我知道我可以通过执行以下代码使其正常工作,但阅读和键入这些代码非常痛苦: 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 @anima

我知道我可以通过执行以下代码使其正常工作,但阅读和键入这些代码非常痛苦:

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

问题的原因是您在每个方法中都创建了一个新的动物对象,而不是传递您首先创建的对象。 在display中,根据Animal['birds']散列的内容从头创建一个新的动物实例。所以它的内容当然不会改变

也许,您也不是要将动物创建为实例变量,而是作为局部变量:只需省略@


谢谢,我没有意识到它和原来的散列是独一无二的。我会按照你的建议把这个论点传给大家。不过,要小心,还有其他需要注意的微妙之处;例如,changer可能不是一个好名字,因为一个方法同时显示它调用display的内容。动物之所以是一个实例变量,是因为它需要被我不能传递参数的方法访问,因此,直到现在我才意识到将b传递给changer不会起作用,因为它是从另一个方法调用的,而该方法甚至没有定义b结构。基本上我只需要从太多的地方对这个散列进行写访问。一次运行脚本的多个实例,因此单个实例变量也不起作用。我还更新了该示例,希望能够澄清我正在尝试执行的操作。
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