[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

A question about Ruby main object

Antti Karanta

1/2/2006 6:25:00 PM



Hi!

I have been doing different things w/ Ruby for a couple of years now and
the only bad thing I can say about it is that it makes programming in other
languages feel awfully burdensome. = )

Anyhow, I really like how everything makes sense. There is one thing that
I have not been able to fit in entirely. A Ruby program starts in the
context of the "main" object,

antti@hyperion:~> ruby -e "puts self"
main
antti@hyperion:~> ruby -e "puts self.class"
Object

However, the methods I declare in the context of this "main" object are
somehow available as private methods of class Object (and naturally usable
from subclasses):

def foo
puts "hello"
end
class Bar
def amethod
foo
end
end
b = Bar.new
b.amethod

outputs:
hello

Is there some logical explanation for this? I understand that this is very
convenient as these methods appear as "stand-alone functions", but taking
it just as "it just is so" breaks the otherwise consistent rules, as
normally you have to define a method in the context of a class for it to be
a method of that class. However, the "main" object is not class Object, nor
is it a class at all:

antti@hyperion:~> ruby -e "puts self.kind_of?(Class)"
false
antti@hyperion:~> ruby -e "puts self.kind_of?(Module)"
false

So what is the logic behind the "main" object? Is there a logical reason
for the methods defined in its context to appear as private methods of
class Object?



-Antti-



10 Answers

Its Me

1/2/2006 7:02:00 PM

0

See

http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/7bb7b451a8f3cca7/98c4c62127b9d945?q=itsme213+main+singleton+Object&rnum=1#98c4c6...

"Antti Karanta" <Antti.Karanta@removethis.iki.fi.nospam> wrote in message
news:dpbr1c$p2b$1@phys-news4.kolumbus.fi...
>
>
> Hi!
>
> I have been doing different things w/ Ruby for a couple of years now and
> the only bad thing I can say about it is that it makes programming in
> other
> languages feel awfully burdensome. = )
>
> Anyhow, I really like how everything makes sense. There is one thing that
> I have not been able to fit in entirely. A Ruby program starts in the
> context of the "main" object,
>
> antti@hyperion:~> ruby -e "puts self"
> main
> antti@hyperion:~> ruby -e "puts self.class"
> Object
>
> However, the methods I declare in the context of this "main" object are
> somehow available as private methods of class Object (and naturally usable
> from subclasses):
>
> def foo
> puts "hello"
> end
> class Bar
> def amethod
> foo
> end
> end
> b = Bar.new
> b.amethod
>
> outputs:
> hello
>
> Is there some logical explanation for this? I understand that this is
> very
> convenient as these methods appear as "stand-alone functions", but taking
> it just as "it just is so" breaks the otherwise consistent rules, as
> normally you have to define a method in the context of a class for it to
> be
> a method of that class. However, the "main" object is not class Object,
> nor
> is it a class at all:
>
> antti@hyperion:~> ruby -e "puts self.kind_of?(Class)"
> false
> antti@hyperion:~> ruby -e "puts self.kind_of?(Module)"
> false
>
> So what is the logic behind the "main" object? Is there a logical reason
> for the methods defined in its context to appear as private methods of
> class Object?
>
>
>
> -Antti-
>
>
>


Florian Groß

1/2/2006 7:26:00 PM

0

Devin Mullins

1/2/2006 7:48:00 PM

0

Antti Karanta wrote:

> So what is the logic behind the "main" object? Is there a logical reason
>for the methods defined in its context to appear as private methods of
>class Object?
>
>
To quote Guy Decoux:

> no, not really. ruby has self and *internally* ruby_class which give it
> where the method must be defined.
>
> For example :
>
> * at top level it has : self = main, ruby_class = Object
>
> when you define a method at top level this will be an Object method
>
> * in the class A, it has : self = A, ruby_class = A
>
> when you define a method in A, this will be an instance method for A
>
Now, I have a question for Guy:

Flagellate = Class.new {
def banana_boat; puts 'hurrah!' end
}

makes banana_boat a method on Flagellate, which makes me think that
methods go where self is.

However:

class FranklinRoosevelt
def smooth_operator; def banana_boat; puts 'javohl!' end end
end
FranklinRoosevelt.new.smooth_operator

makes banana_boat a method on FranklinRoosevelt, which is either
ruby_class or self.class, but not self.

What's goin' on? Is there another internal variable that determines
where methods go, or am I confusing things? Are Class.new and class_eval
just the exception to the rule that method definitions go on ruby_class?
If so, how?

Devin



ts

1/3/2006 10:08:00 AM

0

>>>>> "D" == Devin Mullins <twifkak@comcast.net> writes:

D> Flagellate = Class.new {
D> def banana_boat; puts 'hurrah!' end
D> }

With this you have this case

>>
>> * in the class A, it has : self = A, ruby_class = A
>>

This mean that you have self = ruby_class = Flagellate

D> However:

D> class FranklinRoosevelt
D> def smooth_operator; def banana_boat; puts 'javohl!' end end
D> end
D> FranklinRoosevelt.new.smooth_operator

D> makes banana_boat a method on FranklinRoosevelt, which is either
D> ruby_class or self.class, but not self.

When the method #smoot_operator is called
* self is an instance of FranklinRoosevelt
* ruby_class is FranklinRoosevelt

#banana_boot become a method on FranklinRoosevelt

D> What's goin' on? Is there another internal variable that determines
D> where methods go, or am I confusing things?

You are confusing : the problem is that you can't access the variable
ruby_class, it's completely hidden but ruby always use this variable to
know where it must store a method.

D> Are Class.new and class_eval just the exception to the rule that method
D> definitions go on ruby_class? If so, how?

No, they are not exceptions. This is just that when you write

Flagellate = Class.new {
def banana_boat; puts 'hurrah!' end
}

many persons will except that ruby will do the same that if you write

class Flagellate
def banana_boat; puts 'hurrah!' end
end

This is why it define self = ruby_class = Flagellate



Guy Decoux






ts

1/3/2006 11:19:00 AM

0

>>>>> "t" == ts <decoux@moulon.inra.fr> writes:

t> many persons will except that ruby will do the same that if you write
^^^^^^
expect

l'anglais est vraiment tres etrange :-)



Guy Decoux








Devin Mullins

1/3/2006 12:04:00 PM

0

ts wrote:

>t> many persons will except that ruby will do the same that if you write
> ^^^^^^
> expect
>
> l'anglais est vraiment tres etrange :-)
>
>
Nah... 'snot that bad... :)

Thanks. It turns out my confusion is with constants and class-variables
(whose destination I'd figured was based on ruby_class), not methods, since:

irb(main):001:0> Foo = Class.new {
irb(main):002:1* FOO = 5
irb(main):003:1> }
=> Foo
irb(main):004:0> FOO
=> 5
irb(main):005:0> Foo.class_eval {
irb(main):006:1* @@foo = 5
irb(main):007:1> }
=> 5
irb(main):008:0> @@foo
=> 5

What determines where *they* go?

Thanks,
Devin
Loves me some complex grammar rules...


ts

1/3/2006 12:17:00 PM

0

>>>>> "D" == Devin Mullins <twifkak@comcast.net> writes:

D> Thanks. It turns out my confusion is with constants and class-variables
D> (whose destination I'd figured was based on ruby_class), not methods,
D> since:

Perhaps best to don't speak about class-variable because it seems to be a
*true* POLS, i.e. only matz is not surprised :-)

D> Loves me some complex grammar rules...

It don't exist complex grammar rules, ruby just try to follow matz's POLS

Guy Decoux




Devin Mullins

1/3/2006 12:27:00 PM

0

ts wrote:

>D> Loves me some complex grammar rules...
>
> It don't exist complex grammar rules, ruby just try to follow matz's POLS
>
>
I was talking about English... :P



MenTaLguY

1/3/2006 3:12:00 PM

0

Quoting ts <decoux@moulon.inra.fr>:

> D> Loves me some complex grammar rules...
>
> It don't exist complex grammar rules, ruby just try to follow
> matz's POLS

I can assure you that the Ruby grammar has pretty complex rules if
you're interested in parsing it.

-mental


Antti Karanta

1/3/2006 7:28:00 PM

0

itsme213 wrote:

> See
>
>http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/7bb7b451a8f3cca7/98c4c62127b9d945?q=itsme213+main+singleton+Object&rnum=1#98c4c6...

Thanks, this cleared it up. Weird I did not bump into that thread w/
google...


-Antti-