Ruby 为什么“select”不返回真值,或者是真值?

Ruby 为什么“select”不返回真值,或者是真值?,ruby,Ruby,鉴于 [1,2,5,8,3].collect{|i| i.to_s} #=> ["1", "2", "5", "8", "3"] 根据ruby doc,select=>返回一个新数组,该数组包含ary的所有元素,给定块将为其返回一个真值 这里的值不是真的吗?应该是i.to_s value,因为当块计算为非假时,选择仅从数组中选择值,并返回新数组: [1,2,5,8,3].select{|i| i.to_s} #=> [1, 2, 5, 8, 3] 而collect通过将块应用于每

鉴于

[1,2,5,8,3].collect{|i| i.to_s} #=> ["1", "2", "5", "8", "3"]
根据ruby doc,select=>返回一个新数组,该数组包含ary的所有元素,给定块将为其返回一个真值

这里的值不是真的吗?应该是i.to_s value

,因为当块计算为非假时,选择仅从数组中选择值,并返回新数组:

[1,2,5,8,3].select{|i| i.to_s} #=> [1, 2, 5, 8, 3]
而collect通过将块应用于每个当前数组值来生成新数组:

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

在ruby中,除nil或false以外的任何顺序都是true

因此:

[1,2,5,8,3].select{i | i.to|s}等价于[1,2,5,8,3].select{i | true}

这两者都将评估为:

{|i| i.to_s } # => i.to_s => "String"
正如你在问题中所说的

select=>返回一个新数组,该数组包含ary的所有元素 给定的块返回一个真值

因此,select将返回原始数组,因为块的计算结果始终为true

然而收集

因此:

您可以将collect视为映射操作,将select视为过滤器,因此select的返回值始终是初始数组的子集

[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]
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]