0

列挙型で #detect に似たものを探していますが、完全ではありません。これは列挙可能なものです:

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

条件に一致する配列の最初のインスタンスを返します。今、私の目的は、ブロックの値を返すことです。懸念は正確な条件ではありませんが、たとえば、nil ではない最初の条件です。このようなもの:

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

関数は、nil ではない another_function 呼び出しの最初の結果を返します。

変数にメソッドを適用してから検出を使用する値をマッピングすることはオプションではありません。これは理想的には遅延列挙子で機能する必要があり、可能なすべての値の早期マッピングは不可能です

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 が指摘するまで、最後の段落を見逃していました。

falsetru さん、コメントありがとうございます。

于 2013-07-25T09:28:49.867 に答える