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

sczxawaw  于 2023-01-12  发布在  Ruby
关注(0)|答案(2)|浏览(111)

我真的不知道该如何命名它,不管怎样,我正在用Ruby做一些元编程,当我调试的时候,我遇到了一个对“main:Object”的引用。
这让我想到,如果Ruby类从来没有完全关闭过,而且我可以在以后出于任何原因重新打开它们,那么是否有可能访问这个“main:Object”?如果这真的是一个Object,那么它应该像其他类/对象一样可以访问?如果不是,那么为什么不呢?这是一个真正受保护的空间吗?不管怎样,我想知道我是否可以从Ruby中的任何地方访问它。如果可以,怎么访问?如果不能,为什么不呢?
除了解释器抱怨有些东西不在里面,我没有太多关于这个的参考或信息。我的意思是除了这个是顶级的作用域。但是这不是我真正想知道的。
真的没有太多的东西,下面的帖子讨论了它是什么。
Is there a “main” method in Ruby like in C?
What is “main” in Ruby?
我知道这并没有给予你行动项目的工作,但我希望一些Maven一样分享他们的知识在这里StackOverflow可能会分享它,我们(我)都可以学到一些新的东西。
无论如何,提前感谢。如果这不是正确的论坛,请让我知道哪一个是。

8yoxcaq7

8yoxcaq71#

它是由irb/pry REPLs * 或 * Ruby解释器在顶层引入的一个示例,在任何其他声明之外。

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

当你输入def foo; 42; end时,你实际上扩展了这个对象。

42fyovps

42fyovps2#

TOPLEVEL_BINDING(定义)是您的朋友:

def m1
  class << TOPLEVEL_BINDING.receiver
    def m2
      puts 'm2'
    end
  end
  # or
  # main = TOPLEVEL_BINDING.receiver
  # def main.m2
  #   puts 'm2'
  # end
end
m1
m2 # => m2

或者,可以使用TOPLEVEL_BINGING.eval('self')代替TOPLEVEL_BINGING.receiver

相关问题