Ruby-根据某些条件从数组中选择修改后的值

Ruby-根据某些条件从数组中选择修改后的值,ruby,ruby-1.8.7,Ruby,Ruby 1.8.7,我知道如何在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,3

我知道如何在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]。但是否有“某种方法”给出相同的结果

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

您可以使用reduce:

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


后两个示例可以缩短,例如
(1..10)。选择(&:偶数?).map{x | x*3}
,这使它们非常简洁。Ruby和大多数语言一样,为我们提供了基本的构建块,我们可以使用这些构建块来构建更复杂的功能。当我们想做更复杂的事情,但隐藏了复杂性时,我们定义了一个方法来实现这一点。许多Ruby的内置方法就是这样做的;看看它们的源代码,你就会看到它的基本原理艾夫斯被用来增加额外的生物舒适度,因为有人看到了这一需要。你有什么特别的原因想在这里使用一种方法而不是两种方法吗?在我看来,所有这些例子都非常清楚,除非你在大规模阵列上运行它们,否则性能不太可能是一个主要问题。根据我自己的经验,如果你必须使用
compact
要清理
map
操作,很有可能你做错了什么。对于传入的每个值,
map
都应该发出有用的预期返回值。@AJED32优化并不是减少代码行数或方法链,你需要一个基准来知道哪个更快(这就是优化)在类似的上下文中,下面的代码也起作用:
(1..10).inject([]){| a,x | a同意。其中任何一项工作——它们可能比select+map稍微快一点,但它们不容易阅读,我宁愿优化可读性而不是假设速度。考虑使用
每个带有对象的对象
而不是
减少
注入
每个带有对象的对象
都不需要对象每次注入的ng都会被块返回,这通常会使它更干净。我会使用
(1..10)编写此代码。每个带有_对象([]){x,a | a[6,12,18,24,30]
。我发现使用

(1..10).reduce([]){ |a,x| x.even? ? a << x*3 : a }
(1..10).each_with_object([]) { |x,arr| arr.push(x*3) if x.even? }  ## evaluates to [6, 12, 18, 24, 30]