とても簡単な質問のようですが、私はそれに行き詰まっています。各要素の属性を変更したい:
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 をテストまたは表示するために使用するコード、および最後にその表示またはテストの出力の両方を表示するために、コード リストを拡張できますか?
私のコード例では、それも機能することを示すために、oldergod の提案を含めました。明確さと安全のために、#map に固執することをお勧めします。ただし、引数または呼び出しオブジェクトへの副作用を警告するために、ミューテーター メソッドに感嘆符を付けて名前を付けるのが Ruby の規則であるためです。この場合、item_list の要素が変更されているので、#map! 慣例により、好ましい選択になります。項目を単に印刷するか、その他の操作を行う場合は、#each を選択するとよいでしょう。これは主に好みの問題かもしれないと付け加えるべきです。これは私が慣れ親しんだ慣習ですが、他の開発者コミュニティでは、より互換性があると見なされる可能性があります。