【问题标题】:If `main` is an instance of `Object`, why can't I call it?如果`main`是`Object`的一个实例,为什么我不能调用它呢?
【发布时间】:2011-07-10 04:20:08
【问题描述】:

当我输入self 时,我得到一个返回值main。我做了这个测试:

main2 = Object.new

然后我可以调用main2,它会返回一些东西,但是当我调用main 时,它会引发一个未定义的变量错误。这是怎么发生的?

这是我在其他网站上找到的关于顶级环境如何工作的假设:

class Object  
  Object.new.instance_eval do  
    def self.to_s  
      "main"  
    end  
   private  
    ##  
    # Your program gets inserted here...  
    ##  

  end  
end 

这对我来说很有意义。

【问题讨论】:

    标签: ruby


    【解决方案1】:

    What is the Ruby Top-Level?”是一篇关于 Ruby 顶层的文章,它解释了您需要了解的所有内容。

    不过,顺便说一句,您可以使用TOPLEVEL_BINDING.eval('self') 在程序中的任何位置访问main

    【讨论】:

    • 您提供的文章多么棒,现在完全说得通了,顺便说一句,我了解到#include Module.new,这让我大开眼界!再次感谢!
    • 顺便说一下,从 main 的单例类中删除 to_s 是说明整个结构的好方法!太棒了!
    【解决方案2】:

    irb 中表达式self 的计算确实返回了一个打印 作为主对象的对象。这是一个应该有所帮助的成绩单:

    $ irb
    >> self
    => main
    >> main
    NameError: undefined local variable or method `main' for main:Object
            from (irb):2
    >> self.inspect
    => "main"
    >> self.class
    >> Object
    

    当您在 irb 中键入 main 时,它会尝试评估未声明的变量 main

    【讨论】:

    • 另外,如果你改变self.inspect(例如返回"foo"),那么self将返回“foo”
    【解决方案3】:

    你不能用类似的东西直接引用main对象

    myvar = main
    

    不可能通过它的“名称”来引用它。但是,您可以像这样在名为 main 的变量中捕获它

    main = self
    puts main # => main
    

    top-level object? top-level methods?”是 Ruby 的发明者本人关于主要对象的有用背景信息。

    【讨论】:

    • 现在我现在 main 只是它的单例类的 to_s 方法的返回值,我可以将它传递给变量的方式是从它的单例类中删除 to_s 并返回真实的例如,然后我可以通过它,我从@banister 的文章中学到的东西感谢你们
    猜你喜欢
    • 2014-12-23
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2021-04-15
    相关资源
    最近更新 更多