2

我知道在 Ruby 中选择、收集和映射是如何工作的。我只是想知道是否有类似的原生 Ruby 方法可以组合它们并在一次迭代中给出结果而无需从数组中删除 nil?

例如。

(1..10).map { |x| x*3 if x.even? }.compact
(1..10).select { |x| x.even? }.map{ |x| x*3 }
(1..10).select { |x| x.even? }.collect{ |x| x*3 }

都给出相同的结果,即 [6, 12, 18, 24, 30]。但是'some_method'是否给出了相同的结果?

(1..10).some_method { |x| x*3 if x.even? }  ## evaluates to [6, 12, 18, 24, 30]
4

2 回答 2

2

可枚举#each_with_object

(1..10).each_with_object([]) { |x,arr| arr.push(x*3) if x.even? }  ## evaluates to [6, 12, 18, 24, 30]
于 2014-01-24T19:10:58.080 回答
1

您可以使用减少:

(1..10).reduce([]){ |a,x| a << x*3 if x.even?; a }

或(等效,同样令人困惑):

(1..10).reduce([]){ |a,x| x.even? ? a << x*3 : a }
于 2014-01-24T19:09:38.937 回答