我知之甚少紅寶石,我下面的實現的作品,但我真的覺得這種方法curbsome如何形成從對象列表數組
@surfaces = []
Surface.all.each do |surface|
@surfaces << surface.name
end
目的是提取每個表面的對象和形式的名稱值他們成陣列,誰能告訴我這樣做的聰明方式?謝謝
我知之甚少紅寶石,我下面的實現的作品,但我真的覺得這種方法curbsome如何形成從對象列表數組
@surfaces = []
Surface.all.each do |surface|
@surfaces << surface.name
end
目的是提取每個表面的對象和形式的名稱值他們成陣列,誰能告訴我這樣做的聰明方式?謝謝
使用Enumerable#map
把一個枚舉到另一個枚舉與元素的1對1的映射。當映射只涉及在輸入枚舉的每個元素上調用單個方法時,與Symbol#to_proc
結合使用。
這些兩者都是等效的:
@surfaces = Surface.all.map(&:name)
@surfaces = Surface.all.map do |surface|
surface.name
end
感謝您的及時響應,新年快樂! –
您可以使用Surface.all.collect(&:name)
。
編輯:這是equivelent在做這樣的事情:
Surface.all.collect do |s|
s.name
end
謝謝,它像魔術一樣工作。我查了一下「collect {| item | block}→new_ary」的方法,所以我們傳入一個block。但我不明白「&:name」部分,你能幫忙解釋一下嗎?謝謝 –
@ChrisChen看看我的編輯,並在meagar的回答 –
FYI,收集和地圖別名Ruby中相同的內部圖案。
這裏的stackflow參考:Difference between map and collect in Ruby?
這是函數式編程('map')的最基本的抽象之一:https://code.google.com/p/tokland/wiki/RubyFunctionalProgramming#Blocks_as_higher_order_functions – tokland