2012-12-29 31 views
0

我知之甚少紅寶石,我下面的實現的作品,但我真的覺得這種方法curbsome如何形成從對象列表數組

@surfaces = [] 
Surface.all.each do |surface| 
    @surfaces << surface.name 
end 

目的是提取每個表面的對象和形式的名稱值他們成陣列,誰能告訴我這樣做的聰明方式?謝謝

+0

這是函數式編程('map')的最基本的抽象之一:https://code.google.com/p/tokland/wiki/RubyFunctionalProgramming#Blocks_as_higher_order_functions – tokland

回答

2

使用Enumerable#map把一個枚舉到另一個枚舉與元素的1對1的映射。當映射只涉及在輸入枚舉的每個元素上調用單個方法時,與Symbol#to_proc結合使用。

這些兩者都是等效的:

@surfaces = Surface.all.map(&:name) 

@surfaces = Surface.all.map do |surface| 
    surface.name 
end 
+0

感謝您的及時響應,新年快樂! –

3

您可以使用Surface.all.collect(&:name)

編輯:這是equivelent在做這樣的事情:

Surface.all.collect do |s| 
    s.name 
end 
+0

謝謝,它像魔術一樣工作。我查了一下「collect {| item | block}→new_ary」的方法,所以我們傳入一個block。但我不明白「&:name」部分,你能幫忙解釋一下嗎?謝謝 –

+0

@ChrisChen看看我的編輯,並在meagar的回答 –