更改数组的每个元素

时间:2013-02-21 07:44:06

标签: ruby

这似乎是一个非常简单的问题,但我坚持下去。我想改变每个元素的属性:

item_list = get_items()
item_list.map! do |item|
  item.date = "my super date or whatever...."
  item
end

但是item_list[0].date给了我与map!方法之前完全相同的值。错误在哪里?

1 个答案:

答案 0 :(得分:1)

我不确定是否应该将其写为“答案”,因为它可能不会让您满意,但事实是您的代码应该有效。这是我为证明这一点所做的测试:

$ cat test.rb
#!/usr/bin/env ruby

item0 = Struct.new( :date, :name ).new( '0', 'zero' )
item1 = Struct.new( :date, :name ).new( '1', 'one'  )
item_list = [ item0, item1 ]

puts "BEFORE #map!:"
puts item_list

item_list.map! do |item|
    item.date = 'super date'
    item
end

puts
puts "AFTER #map!:"
puts item_list

item_list.each do |item|
    item.date = 'each date'
    item
end

puts
puts "AFTER #each:"
puts item_list

$ ./test.rb
BEFORE #map!:
#<struct #<Class:0x1002b15f0> date="0", name="zero">
#<struct #<Class:0x1002b1258> date="1", name="one">

AFTER #map!:
#<struct #<Class:0x1002b15f0> date="super date", name="zero">
#<struct #<Class:0x1002b1258> date="super date", name="one">

AFTER #each:
#<struct #<Class:0x1002b15f0> date="each date", name="zero">
#<struct #<Class:0x1002b1258> date="each date", name="one">

您可以扩展代码清单,以显示get_items()的定义以及用于测试或显示item_list的代码,最后显示该显示或测试的输出吗?

在我的代码示例中,我包含了oldgod的建议,以表明它也有效。为了清晰和安全起见,您可能希望坚持使用#map!虽然因为它是一个Ruby约定,用一个惊叹号命名mutator方法,以警告对参数或调用对象的副作用。在这种情况下,item_list的元素正在改变,所以#map!按照惯例,这是一个更好的选择。如果您只是打印出物品或进行其他操作,那么#each将是一个不错的选择。应该添加这可能主要是品味问题。这是我习惯的惯例,但在其他开发者社区中,他们可以被认为更易于互换。