6

例えば:

a = [1,2,3,4,5]
a.delete_if { |x| x > 3 }

次と同等です。

a = [1,2,3,4,5]
a.delete_if.each.each.each.each { |x| x > 3 }

a.delete_if私は列挙子を返すことを知っています。eachしかし、ブロックが true を返したときに、オブジェクトを削除する必要があることをどのように判断するのでしょうか? delete_if手で (そして Ruby で)実装する方法は?

4

2 に答える 2

4

Rubinius のソース コードを見ることができます: enumerable モジュール

reject メソッドの例を次に示します。

  def reject
    return to_enum(:reject) unless block_given?

    ary = []
    each do |o|
      ary << o unless yield(o)
    end

    ary
  end
于 2011-10-07T19:56:27.283 に答える
1

の実装でdelete_ifは、コードは から返された値を検証してyield、指定されたエントリを配列から削除するかどうかを決定できます。

詳細については、プログラミング Ruby ガイドのイテレータの実装を読むことができますが、次のようになります。

class Array
  def delete_if
     reject { |i| yield i }.to_a
  end
end

上記はyield、配列内の各項目を への呼び出しに関連付けられたブロックに渡すために使用しdelete_if、暗黙的に の値をyield外側のreject呼び出しに返します。

于 2011-10-07T19:53:48.987 に答える