gpt4 book ai didi

ruby - 是否可以使用无绑定(bind) block ?

转载 作者:数据小太阳 更新时间:2023-10-29 07:56:20 24 4
gpt4 key购买 nike

是否可以将 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com