1

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

我将一个块传递给类似的方法:Generator.generate(...) {|x| ...}. 我想存储块,因为我在一些子例程中调用它,这些子例程从不同的地方被调用了很多次。

当然我可以在所有方法和调用中拖动 &block,但我想将它实际保存在一个类变量中并在适当的方法中使用它。

像这样的东西:

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

是否可以存储一个块并在以后使用一些参数生成它?

4

2 回答 2

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]
于 2012-06-21T10:48:14.327 回答
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
于 2012-06-21T10:50:02.227 回答