0

コントローラーのクラス変数にブロックを格納し、それをインスタンスから呼び出すと、スレッド スコープで問題が発生しますか? ブロックに渡されるパラメーターは、インスタンスごとにローカルです。

コード例は次のとおりです。

class BlockExecutor
  def initialize(&block)
    self.instance_eval &block
  end
  def sub_block(&block)
    @block = block
  end
  def call(object)
    @block.call(object)
  end
end

module ClassDSL
  extend ActiveSupport::Concern
  module ClassMethods
    def define(&block)
      @executor = BlockExecutor.new &block
    end

    def execute_block(object)
      @executor.call(object)
    end
  end
end

class Controller
  include ClassDSL

  define do 
    sub_block do |object|
      # mutate object
    end
  end

  def run
    new_object = self.class.execute_block(object)
  end
end
4

1 に答える 1

0

まず、コントローラーで次のようなものを忘れたと思います:

class Controller
  include ClassDSL
  extend ClassDSL::ClassMethods
  ...
end

または、おそらく ClassDSL モジュール内から:

module ClassDSL
  def self.included(base)
    base.extend(ClassMethods)
  end
  ..
end

とはいえ、本当にスレッドについて話しているのですか、それとも単にプロセスについて話しているのですか? プロセスでは問題はありませんが、スレッドを使用してアクションを実行するとすぐに、複数のスレッドが @executor class-instance 変数を共有するため、そこに格納されているブロックを実行するたびに、どのスレッドが責任を負っているかを知ることはできません。その定義。

したがって、最終的には、ブロック内で実行しているコードと、ローカル スコープの変数のみを変更するかどうかによって異なります。「オブジェクト」はローカルのようですが、スレッドのスコープ外の他のオブジェクトを簡単に参照する可能性があります。

于 2013-01-25T12:35:36.130 に答える