0

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

[1, 2, 3].detect {|i| i > 1 } #=> 2

它返回与条件匹配的数组的第一个实例。现在,我的目的是返回块的值。关注不完全是条件,但例如,第一个不是零。像这样的东西:

[var1, var2, var3].wanted_detect {|var| another_function(var) } 

其中函数将返回 another_function 调用的第一个结果,该结果不是 nil。

映射在变量上应用方法的值,然后使用检测不是一种选择。理想情况下,这必须在惰性枚举器中工作,所有可能值的早期映射是不可行的

4

1 回答 1

2
[var1, var2, var3].lazy.map { |var| another_function(var) }.reject(&:nil?).first

如果您无权访问Enumerable#lazy,则很容易实现您想要的:

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

演示:

[1, 2, 3, 4].wanted_detect { |x| x*x if x > 2 }
# => 9

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

谢谢你的评论,假的。

于 2013-07-25T09:28:49.867 回答