Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如果'main'是'Object'的实例,为什么我不能调用它?_Ruby - Fatal编程技术网

Ruby 如果'main'是'Object'的实例,为什么我不能调用它?

Ruby 如果'main'是'Object'的实例,为什么我不能调用它?,ruby,Ruby,当我键入self时,我得到一个返回值main。我做了这个测试: main2 = Object.new 然后我可以调用main2,它会返回一些东西,但是当我调用main时,它会引发一个未定义的变量错误。这是怎么发生的 以下是我在其他网站上找到的关于顶级环境如何工作的假设: class Object Object.new.instance_eval do def self.to_s "main" end private ##

当我键入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 
这对我来说很有意义。

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

myvar = main
不可能用它的名字来指代它。但是,您可以将其捕获到名为main的变量中,如下所示

main = self
puts main # => main

是Ruby的发明家自己提供的关于主对象的有用背景信息。

在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。

是一篇关于Ruby顶层的文章,解释了您需要知道的一切


另外,如果您将self.inspect更改为return foo(例如,self将返回foo),则self将返回foo您提供了一篇多么棒的文章,现在完全有意义了,通过我学习的include Module.new,这让我大开眼界!再次感谢!顺便说一句,从main的singleton类中删除to_s是说明整个结构的好方法!伟大的现在我现在main只是它的singleton类的to_方法的一个返回值,我可以将它传递给一个变量的方法是,从它的singleton类中删除to_,然后自返回真实的实例,然后我可以传递它,这是我从@banister的文章中学到的,谢谢你们