如何从名称空间访问主对象?

时间:2018-07-20 00:11:23

标签: ruby

我正在重构一些加载到Rails控制台中的调试工具。调试工具曾经使用在代码中进行修改的全局变量,但是出于明显的原因,我想将其限制为名称空间,因此我将所有内容都放入类中,而使用类实例变量。

在某些时候,这些工具需要在#reload!对象上定义的控制台中调用main。将工具移至新类后,将无法再访问main定义的方法。是否有一种从命名空间访问main的好方法,以便我可以在其上调用#reload!

现在,我在TOPLEVEL_BINDING.receiver.reload!上工作正常,但是我敢肯定有更好的方法。更好的解决方案也可能对Ruby命名空间具有启发性。

例如

class MyAwesomeTools
  def reload!
    # or whatever executes #reload! with main as the receiver
    MAIN_NAMESACE.reload!
  end
end

1 个答案:

答案 0 :(得分:5)

除了TOPLEVEL_BINDING.receiver之外,我还没有更整洁的选择来访问main;确实,这不是人们经常需要去做的事情。

但是,要执行您描述的特定于Rails的操作,我建议跳过控制台帮助程序并直接调用“真实”重新加载方法:

Rails.application.reloader.reload!

那是all the helper method does(从Rails 5.0+开始;在那之前是spelt slightly differently)。