2011-07-30 8 views
5

定型的なベンチマークコードを作成するために、列挙可能なブロック内で収穫したいと考えています。Ruby:数量内の収量

基本的に私はこの(簡体字)何かをしたいと思います:

def iterator(enumerable, &block) 
    iterations = enumerable.size 
    counter = 0 
    enumerable.each do |item| 
    counter +=1 
    puts "Iterating #{counter}/#{iterations}..." 
    yield 
    end 
end 

その後、私は、私は次のようになり、ブロックの周りにこの定型ベンチマークコードをラップするために、この方法を使用できるようにしたいと思いますが

# assuming foo is an enumerable collection of objects 
iterator foo do 
    item.slow_method 
    item.mundane_method 
    item.save 
end 

...と、このコードが実行されたときに、私は次のログ出力を得るでしょう:私はのようなものを呼び出すことができるように、繰り返し処理

Iterating 1/1234... 
Iterating 2/1234... 
Iterating 3/1234... 

このようなことが可能でなければならないと思われますが、私は構文を理解することができず、そのようなことを(それを調べるために)呼び出すこともできませんでした。

問題は、私が反復するために起こっている列挙オブジェクトOUTSIDE、また、反復ブロック内の両方の決まり文句をラップする必要があります。私は列挙可能なオブジェクトをうまく渡すことができますが、渡されたブロック内から反復オブジェクトのメソッドを呼び出すことはできません。

この説明が意味をなさないことを願っています。それ。あなたが何かを明確にする必要がある場合はコメントを残してください。私はより良く説明しようとします。

+0

あなたが行う.each 'enumerable.zip(1..size)を使用することをお勧めします|アイテム、カウンタ''より洗練された "探しているコードのための' '。 –

答えて

7

Rubyのyieldステートメントは引数を取ることができます。あなたが言いたいのは、

yield item 

これは、 "現在の"項目を "外側の"ブロックに渡します。

私は質問を正しく理解しました。

補遺

そして、ここではアクションでそれを表示するためのコードです:

class Item 
    def initialize(id) 
    @id = id 
    end 
    def slow_method() 
    puts "slow #@id" 
    end 
    def mundane_method() 
    puts "mundane #@id" 
    end 
    def save() 
    puts "save #@id" 
    end 
end 

foo = [Item.new(100), Item.new(200), Item.new(300)] 

def iterator(enumerable, &block) 
    iterations = enumerable.size 
    counter = 0 
    enumerable.each do |item| 
    counter +=1 
    puts "Iterating #{counter}/#{iterations}..." 
    yield item 
    end 
end 

iterator foo do |item| 
    item.slow_method 
    item.mundane_method 
    item.save 
end 
+0

それはそれを修正しました、これはまさに私が知る必要があったものです。ありがとうございました! – Andrew