If `main` is an instance of `Object`, why can't I call it?
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_ev开发者_开发技巧al do
def self.to_s
"main"
end
private
##
# Your program gets inserted here...
##
end
end
It makes sense to me.
"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')
.
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.
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.
精彩评论