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 类实例变量,因此每当您运行存储在其中的块时,您永远不会知道哪个线程负责它的定义。

所以最后,这取决于您在块中执行的代码以及您是否只改变局部范围的变量。您的“对象”似乎是本地的,但可能很容易引用线程范围之外的其他对象。

于 2013-01-25T12:35:36.130 回答