Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

If `main` is an instance of `Object`, why can't I call it?

Tags:

ruby

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.

like image 510
mko Avatar asked Jul 10 '11 04:07

mko


3 Answers

"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').

like image 96
horseyguy Avatar answered Nov 13 '22 02:11

horseyguy


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.

like image 22
Ray Toal Avatar answered Nov 13 '22 00:11

Ray Toal


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.

like image 32
emboss Avatar answered Nov 13 '22 01:11

emboss