2013-02-21 165 views
0

這似乎是一個非常簡單的問題,但我困在它上面。我想改變每個元素的屬性:更改數組中的每個元素

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

item_list[0].date給我一模一樣的價值在於它之前map!方法了。錯誤在哪裏?

+0

如果我是對的,你可以做'item_list.each {| item | item.date =「無論」}'。 – oldergod 2013-02-21 07:48:05

+0

無法正常工作..... – 2013-02-21 07:52:14

+1

'get_items'是否會首先返回副本? – AJcodez 2013-02-21 07:54:02

回答

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!按慣例是最好的選擇。如果你只是打印出這些物品或者做一些其他的操作,那麼#每個都是不錯的選擇。應該增加這可能很大程度上是一個品味問題。這是我習慣的慣例,但在其他開發者社區中,它們可以被認爲更加可以互換。

相關問題