Array#select
と似た関数が必要でしたが、データ項目だけでなく要素のインデックスもブロックに渡しました(Enumerable#each_with_index
に似ています)。私はこれを試してみました:Ruby:列挙子を組み合わせて新しい列挙子を作成する
class Array
def select_with_index
self.each_with_index.select {|*args| yield(*args)}.map(&:first)
end
end
これが実際に動作しているようです:
["a", "a"]
で
['a','b','a','a','c'].select_with_index {|letter,index| letter == 'a' && index > 1 }
結果、予想通り。しかし、私の解決策が気に入らないのは、ブロックにブロックがあるということです。 Rubyコアの同様のメソッドは、ブロックなしで呼び出すことができ、Enumerator
を生成することができます。これどうやってするの?ブロックの存在をテストするのにblock_given?
を使うことができますが、どうすれば続けることができますか? Fiber
が必要ですか?
ところで、このコードは両方ともRuby 1.9.3で動作するはずです。 2.x。
メタプログラミングでは使いにくいです。 g。 'public_send selector_name、&λ'のようなものです。 – mudasobwa
さて、ちょうどこれに名前をつけてください:http://pastie.org/10786273 –