【问题标题】:Is it possible to access "main:Object" in Ruby?是否可以在 Ruby 中访问“main:Object”?
【发布时间】:2021-05-28 02:14:20
【问题描述】:

我真的不知道还有什么方法可以赋予这个权限。无论如何,我正在用 Ruby 进行一些元编程,而在调试时,我遇到了对“main:Object”的引用。

这让我想到,如果 Ruby 类从未完全关闭并且我以后可以出于任何原因重新打开它们,是否可以访问这个“main:Object”?如果这真的是一个对象,应该像任何其他类/对象一样可能吗?如果不是,那为什么不呢?这是一个真正受保护的空间吗?不管怎样,我想知道我是否可以从 Ruby 的任何地方访问它。如果是这样怎么办?如果不是,为什么不呢?

除了口译员抱怨里面没有东西,我真的没有很多关于这个的参考或信息。我的意思是除此之外是顶级范围。但这并不是我真正想知道的。

那里确实没有多少,下面的这些帖子讨论了它是什么。

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

我知道这不会让您使用操作项,但我确实希望在 StackOverflow 中分享他们的知识的一些专家可能会分享它,并且我们(我)都可以学习新的东西。

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

【问题讨论】:

  • 您的问题不清楚。您是在问如何获取对 main 对象的引用吗?这很简单,在顶层selfmain

标签: ruby


【解决方案1】:

它是由irb/pry REPL 引入的实例 Ruby 解释器在顶层,在任何其他声明之外。你可以看看它是怎么做的:

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

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

【讨论】:

  • 顶层定义的方法是Object的私有实例方法,而不是main的单例方法。
  • @JörgWMittag main> self.methods.grep(/foo/) #⇒ [:foo]main> Object.private_instance_methods.grep(/foo/) #⇒ []。我错过了什么?
  • 你有没有机会在 IRb 中测试这个?在 IRb 中,它们成为 Objectpublic 实例方法。 IRb 与 Ruby 的众多不兼容之一。您应该始终使用纯 Ruby 进行测试,尤其是在涉及边缘情况的情况下。
  • Pry 似乎有同样的错误。
  • This 可能是irb 的相关部分。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 2022-08-24
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2010-10-21
    • 2020-02-17
    相关资源
    最近更新 更多