3

是否可以将一个块传递给一个方法,并确保该块本身没有绑定,以便它只能在另一个实例的上下文中执行(使用{class/module/instance}_eval)而不是简单地发送:call

这是一个激励的例子

module M
  class File
  end  
end  
M.module_eval "File"      # => M::File
M.module_eval do File end # => File

我希望上面的最后一行返回M::File类而不是::File.

要记住的另一件事是,在我的具体应用程序中,模块M是动态创建的(在方法调用中),而不是静态创建的(在 Ruby 文件中,如上所示)。这就是它的实际工作方式:

def create_module(name, &block)
  mod = Module.new
  Object.send :const_set name, mod
  mod.module_eval &block
end

create_module :M do
  file_cls = Class.new
  M.send :const_set, :File, file_cls
  File # => ::File (and I would like M::File)
end

谢谢。

4

1 回答 1

4

我认为以后(在不同的命名空间中)评估表示常量(其中类和模块是特殊情况)的标记是不可能的。常量是在第一次解析时设置的,所以如果你有一个File要被解析为一个令牌的令牌,它将在解析的时刻(以及在解析的上下文中)被评估。您可以做的最好的事情是传递类似:Fileor的东西"File",它们不会被解析为常量,然后以某种方式让它参与常量的定义(例如,使用const_set)。

于 2013-09-13T13:40:05.103 回答