ruby enumerables:是否对块计算的结果进行检测?

ruby enumerables:是否对块计算的结果进行检测?,ruby,arrays,enumerable,Ruby,Arrays,Enumerable,我正在寻找类似于#detect in enumerables的东西,但不完全如此。这就是enumerable所做的: [1, 2, 3].detect {|i| i > 1 } #=> 2 它返回与条件匹配的数组的第一个实例。现在,我的目的是返回块的值。关注的不完全是条件,但例如,第一个条件不是零。大概是这样的: [var1, var2, var3].wanted_detect {|var| another_function(var) } 函数将返回另一个非nil的函数调用的第

我正在寻找类似于#detect in enumerables的东西,但不完全如此。这就是enumerable所做的:

[1, 2, 3].detect {|i| i > 1 } #=> 2
它返回与条件匹配的数组的第一个实例。现在,我的目的是返回块的值。关注的不完全是条件,但例如,第一个条件不是零。大概是这样的:

[var1, var2, var3].wanted_detect {|var| another_function(var) } 
函数将返回另一个非nil的函数调用的第一个结果

映射将方法应用于变量然后使用detect的值不是一个选项。理想情况下,该方法必须在惰性枚举器中工作,因为所有可能值的早期映射是不可能的

[var1, var2, var3].lazy.map { |var| another_function(var) }.reject(&:nil?).first
如果您无法访问
可枚举的#lazy
,则实现您想要的功能非常简单:

module Enumerable
  def wanted_detect
    self.each do |obj|
      val = yield obj
      return val if val
    end
  end
end
演示:

编辑:对不起,我错过了最后一段,直到falsetru指出


感谢您的评论,falsetru。

OP说,
映射将方法应用于变量然后使用检测的值不是一个选项。
在块中,您没有调用另一个函数
。它应该是另一个函数(var)
。不,我没有访问lazy(1.9.3)的权限。如果我错了,请纠正我,但是compact不返回数组吗?这意味着,通过在可枚举项上调用compact,我将在第一次调用之前在数组中转换它,从而在数组的每个元素上不必要地调用另一个函数?我希望在现有API上使用组合,而不必编写自己的可枚举实现,我想看看现有的API是否可行。在尝试使用所述的
lazy
时,我得到了#`的错误
undefined方法
compact'。
[1, 2, 3, 4].wanted_detect { |x| x*x if x > 2 }
# => 9