2014-01-30 54 views
1
[1,2,5,8,3].collect{|i| i.to_s} #=> ["1", "2", "5", "8", "3"] 

鑑於爲什麼「選擇」不會返回真值或是它?

[1,2,5,8,3].select{|i| i.to_s} #=> [1, 2, 5, 8, 3] 

作爲每紅寶石-doc的select => "Returns a new array containing all elements of ary for which the given block returns a true value."

是不是真值在這裏應該i.to_s

回答

2

在紅寶石任何次序nilfalsetrue

所以:

[1,2,5,8,3].select{|i| i.to_s}相當於到[1,2,5,8,3].select{|i| true }

哪窩ULD都評估爲:

[1,2,5,8,3].select{|i| i.to_s} #=> [1, 2, 5, 8, 3] 
[1,2,5,8,3].select{|i| true } #=> [1, 2, 5, 8, 3] 

當您在問題所述

選擇=>「返回包含元的所有元素用於 所述給定塊返回一個真值的新數組。

因此select會返回原始數組,因爲塊總是計算爲true。

然而collect

Returns a new array with the results of running block once for every element in enum. 

所以:

[1,2,5,8,3].collect{|i| i.to_s} #=> ["1", "2", "5", "8", "3"] 
[1,2,5,8,3].collect{|i| true } #=> [true, true, true, true, true] 
1

由於#select的只從陣列中,當選擇該值塊評估爲非false,並返回新陣列:

{|i| i.to_s } # => false|nil or non-false|nil 

#collect生成由appying塊到每個當前數組值的新的數組:

{|i| i.to_s } # => i.to_s => "String" 
0

你能想到的#collect作爲地圖操作和#select作爲過濾,因此#select的返回值始終是一個初始數組的子集。

相關問題