不確定是否應該將此作爲「答案」來寫,因爲它可能不會讓您滿意,但事實是您的代碼應該可以工作。這是一個測試我沒有證明這一點:
$ 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!按慣例是最好的選擇。如果你只是打印出這些物品或者做一些其他的操作,那麼#每個都是不錯的選擇。應該增加這可能很大程度上是一個品味問題。這是我習慣的慣例,但在其他開發者社區中,它們可以被認爲更加可以互換。
如果我是對的,你可以做'item_list.each {| item | item.date =「無論」}'。 – oldergod 2013-02-21 07:48:05
無法正常工作..... – 2013-02-21 07:52:14
'get_items'是否會首先返回副本? – AJcodez 2013-02-21 07:54:02