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

标签 ruby

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

相关文章:

ruby-on-rails - 禁用主动疯狂发货

python - Ruby:获取python脚本的返回值

ruby - 使用 Sinatra 时与数据库对话的最佳方式是什么?

ruby - 如何停止 binding.pry 在循环内执行?

ruby-on-rails - 如何在我的 Rails 数据库中加密 OAuth secret / token ?

ruby-on-rails - 访问 Rails Assets 的相对路径

ruby - 想要回显新行字符

ruby - 在 Ubuntu 14.04 上使用 RVM 安装 Ruby 2.2.2 时出错

ruby - 使用 RSpec 检查某物是否是另一个对象的实例

mysql - 未定义的方法 `digest' 与 rails 4.0.1