0

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

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

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

4

1 回答 1

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!但是,因为使用感叹号来命名 mutator 方法是 Ruby 的惯例,以警告参数或调用对象的副作用。在这种情况下,item_list 的元素正在更改,所以#map!按照惯例,将是更可取的选择。如果您只是打印出项目或进行一些其他操作,那么 #each 将是一个不错的选择。应该添加这在很大程度上可能是一个口味问题。这是我习惯的约定,但在其他开发者社区中,它们可以被认为更具可互换性。

于 2013-02-21T08:01:05.633 回答