是否可以在Ruby中访问“ main:Object”?

时间:2019-08-09 07:01:01

标签: ruby

我真的不知道该怎么赋予这个权利。无论如何,我正在Ruby中进行一些元编程,并且在调试时遇到了对“ main:Object”的引用。

这让我开始思考,如果Ruby类从来没有完全关闭过,并且以后由于某种原因我可以重新打开它们,是否可以访问此“ main:Object”?如果这确实是一个对象,则应该像其他任何类/对象一样可能吗?如果不是,那为什么不呢?这是真正受保护的空间吗?无论哪种方式,我都想知道是否可以从Ruby中的任何位置访问它。如果是这样怎么办?如果不是,为什么呢?

除了口译员抱怨那里没有东西外,我还没有太多与此相关的参考文献或信息。我的意思是除此以外是顶级范围。但这不是我真正想知道的。

实际上没有太多东西了,下面的这些帖子都在谈论它是什么。

Is there a “main” method in Ruby like in C?
What is “main” in Ruby?

我知道这不能使您使用操作项,但我希望某些类似的专家可以在StackOverflow上分享他们的知识,我们可以共享一些新知识。

无论如何,先谢谢。如果这不是正确的论坛,请告诉我哪个。

2 个答案:

答案 0 :(得分:1)

这是一个由irb / pry的REPLs顶级实例( Ruby解释器)引入的实例,不包含任何其他声明。您可能会检查它的作用:

self
#⇒ main
self.class
#⇒ Object
self.__id__
#⇒ 47421128700280

当您键入def foo; 42; end时,您实际上会扩展该对象。

答案 1 :(得分:0)

TOPLEVEL_BINDING (definition) 是你的朋友:

def m1
  class << TOPLEVEL_BINDING.eval('self')
    def m2
      puts 'm2'
    end
  end
  # or
  # main = TOPLEVEL_BINDING.eval('self')
  # def main.m2
  #   puts 'm2'
  # end
end
m1
m2 # => m2