2012-06-21 29 views
1

好吧,這是我想要做的:我可以以某種方式存儲一個塊供以後使用嗎?

我將一個塊通過如下方法:Generator.generate(...) {|x| ...}。我想存儲這個塊,因爲我在一些子程序中調用它,從不同的地方被調用了一堆。

當然,我可以拖動&塊通過所有的方法和調用,但我想實際上將它保存在一個類變量,並在適當的方法中使用它。

事情是這樣的:

class Generator 
    class << self 
    attr_accessor :my_block 

    def generate(..., &block) 
     my_block = &block 
     ....each {important_method(x)} 
    end 

    def important_method(x) 
     my_block.yield(x) 
    end 
    end 
end 

是否有可能存儲塊,後來有一些參數產生的呢?

回答

1

你需要做2個調整你的代碼:

class Generator 
    class << self 
    attr_accessor :my_block 

    def generate(..., &block) 
     self.my_block = block # Because otherwise you're just setting a method-local variable 
     ....each {important_method(x)} 
    end 

    def important_method(x) 
     my_block.call(x) # Because this is how Proc objects are called 
    end 
    end 
end 
1

如果您的方法接受&block表單中的塊,那麼它將轉換爲Proc對象並可以存儲到變量中。您可以稍後通過發送call消息來調用它。

my_block.call(x) 

又如

class Foo 

    def init &block 
    @my_block = block 
    end 

    def process ary 
    ary.each do |a| 
     @my_block.call a 
    end 
    # or this 
    # ary.each(&@my_block) 
    end 
end 

f = Foo.new 
f.init {|a| puts a} 
f.process [1, 2, 3] 
相關問題