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

コードに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 に答える
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 に答える