私はルビーについてほとんど知りません、私の次の実装はうまくいきます、しかし私はアプローチが抑制されていると本当に感じます
@surfaces = []
Surface.all.each do |surface|
@surfaces << surface.name
end
目的は、各サーフェスオブジェクトの名前の値を抽出し、それらを配列に形成することです。これを行うための賢い方法を教えてもらえますか?ありがとう
私はルビーについてほとんど知りません、私の次の実装はうまくいきます、しかし私はアプローチが抑制されていると本当に感じます
@surfaces = []
Surface.all.each do |surface|
@surfaces << surface.name
end
目的は、各サーフェスオブジェクトの名前の値を抽出し、それらを配列に形成することです。これを行うための賢い方法を教えてもらえますか?ありがとう
を使用できますSurface.all.collect(&:name)
。
編集:これは次のようなことをするのと同じです:
Surface.all.collect do |s|
s.name
end
要素の1対1のマッピングを使用Enumerable#map
して、ある列挙型を別の列挙型に変換するために使用します。Symbol#to_proc
マッピングに、列挙可能な入力の各要素で単一のメソッドを呼び出すだけの場合と組み合わせます。
これらは両方とも同等です。
@surfaces = Surface.all.map(&:name)
@surfaces = Surface.all.map do |surface|
surface.name
end
参考までに、エイリアスを収集して、Rubyの同じ内部パターンにマップします。
スタックフローのリファレンスは次のとおりです。Rubyでのマップと収集の違いは?