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 をテストまたは表示するために使用するコード、および最後にその表示またはテストの出力の両方を表示するために、コード リストを拡張できますか?

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

于 2013-02-21T08:01:05.633 に答える