我可以以某种方式存储块供以后使用吗?

时间:2012-06-21 10:46:07

标签: ruby

好的,这就是我想要做的事情:

我将块传递给类似: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

是否可以存储一个块并稍后用一些参数产生它?

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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