如果我将块存储在控制器的类变量中,然后从实例调用它,是否会导致线程范围出现问题? 传递给块的参数对于每个实例都是本地的。
以下是代码示例:
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
答案 0 :(得分:0)
首先,我认为您在控制器中忘记了以下内容:
class Controller
include ClassDSL
extend ClassDSL::ClassMethods
...
end
或者可能来自ClassDSL模块:
module ClassDSL
def self.included(base)
base.extend(ClassMethods)
end
..
end
那就是说,你真的在谈论线程还是只是进程?使用进程,你没有问题,但是一旦你使用线程来运行动作,多个线程将共享@executor类 - 实例变量,所以每当你运行存储在那里的块时,你永远不会知道哪个线程负责它的定义。
所以最后,它取决于你在块中执行的代码以及是否只改变本地范围的变量。您的“对象”似乎是本地的,但可能很容易引用线程范围之外的其他对象。