If `main` is an instance of `Object`, why can'

2020-02-10 06:28发布

When I type self, I get a return value main. I made this test:

main2 = Object.new

Then I can call main2, and it returns something, but when I call main, it raises an undefined variable error. How does this happen?

Here's the assumption I found in other site about how this top level environment works:

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

  end  
end 

It makes sense to me.

标签: ruby
3条回答
【Aperson】
2楼-- · 2020-02-10 06:57

You can't refer to the main object directly with something like

myvar = main

It's not possible to refer to it by its "name". However, you can capture it in a variable named main like this

main = self
puts main # => main

"top-level object? top-level methods?" is useful background information on the main object by Ruby's inventor himself.

查看更多
狗以群分
3楼-- · 2020-02-10 07:14

"What is the Ruby Top-Level?" is an article on the Ruby top level that explains everything you need to know.

As an aside however, you can access main anywhere in your program by using TOPLEVEL_BINDING.eval('self').

查看更多
够拽才男人
4楼-- · 2020-02-10 07:18

The evaluation of the expression self in irb does return an object that prints as main. Here is a transcript that should help:

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

When you type main into irb, it tries to evaluate the variable main which is not declared.

查看更多
登录 后发表回答