这似乎是一个非常简单的问题,但我坚持下去。我想改变每个元素的属性:
item_list = get_items()
item_list.map! do |item|
item.date = "my super date or whatever...."
item
end
但是item_list[0].date
给了我与之前map!
方法完全相同的值。错误在哪里?
这似乎是一个非常简单的问题,但我坚持下去。我想改变每个元素的属性:
item_list = get_items()
item_list.map! do |item|
item.date = "my super date or whatever...."
item
end
但是item_list[0].date
给了我与之前map!
方法完全相同的值。错误在哪里?
不确定我是否应该将其写为“答案”,因为它可能无法满足您的要求,但事实是您的代码应该可以工作。这是我为证明这一点所做的测试:
$ 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!但是,因为使用感叹号来命名 mutator 方法是 Ruby 的惯例,以警告参数或调用对象的副作用。在这种情况下,item_list 的元素正在更改,所以#map!按照惯例,将是更可取的选择。如果您只是打印出项目或进行一些其他操作,那么 #each 将是一个不错的选择。应该添加这在很大程度上可能是一个口味问题。这是我习惯的约定,但在其他开发者社区中,它们可以被认为更具可互换性。