是否可以将 block 传递给方法,并确保 block 本身没有绑定(bind),以便它只能在另一个实例的上下文中执行(使用 {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
谢谢。
最佳答案
我认为稍后(在不同的命名空间内)评估表示常量(其中类和模块是特例)的标记是不可能的。常量是在第一次解析时设置的,因此如果您有一个 token File
要作为 token 进行解析,它将在解析时(和上下文中)被评估。你能做的最好的事情就是传递类似 :File
或 "File"
的东西,它们不会被解析为常量,并且稍后以某种方式让它参与常量的定义(例如,使用 const_set
)。
关于ruby - 是否可以使用无绑定(bind) block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18786289/