[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Singleton Methods

bparanj@gmail.com

10/27/2006 6:12:00 AM

What is the purpose of singleton method? Why is singleton method
defined on individual object instead of a class? TIA

4 Answers

Eero Saynatkari

10/27/2006 6:26:00 AM

0

On 2006.10.27 15:15, bparanj@gmail.com wrote:
> What is the purpose of singleton method? Why is singleton method
> defined on individual object instead of a class? TIA

That, precisely, IS the point of a singleton method: being defined
for one object only. It is often useful to be able to define special
behaviour for an individual object. One could imagine several things
but a very good example is one that you have seen before on some
instances of class Class:

class Foo
def self.foo
puts 'Yay singletons!'
end
end

# Same as
Foo = Class.new

def Foo.foo
puts 'Yay singletons!'
end

This is how Ruby implements 'class methods' without having to
include any special behaviour. Just objects and singleton methods.

Generally, any object-level customisation. In Ruby, a type is
more important than a class.

???? ??????

10/27/2006 7:28:00 AM

0


On Oct 27, 2006, at 10:15 AM, bparanj@gmail.com wrote:

> What is the purpose of singleton method? Why is singleton method
> defined on individual object instead of a class? TIA
>
>

You call Article.new. new is the singleton method of object Article.
It is not "class method", there is no such thing in Ruby. There is
singleton method of object Article

Rick DeNatale

10/27/2006 2:06:00 PM

0

On 10/27/06, Max Lapshin <max@maxidoors.ru> wrote:
>
> On Oct 27, 2006, at 10:15 AM, bparanj@gmail.com wrote:
>
> > What is the purpose of singleton method? Why is singleton method
> > defined on individual object instead of a class? TIA
> >
> >
>
> You call Article.new. new is the singleton method of object Article.
> It is not "class method", there is no such thing in Ruby. There is
> singleton method of object Article

Not really.

irb(main):001:0> class Article
irb(main):002:1> end
=> nil
irb(main):003:0> Article.method(:new)
=> #<Method: Class#new>

new is an instance method of Class.

irb(main):004:0> Class.instance_methods.include?("new")
=> true

Article (or any Class object) is an instance of Class and gets the
new method by normal inheritance.

irb(main):005:0> Article.class
=> Class

irb(main):006:0> Article.method(:new)
=> #<Method: Class#new>

Each class object does have a singleton class where any class methods live.

irb(main):008:0> Article.singleton_methods
=> []
irb(main):009:0> class Article
irb(main):010:1> def self.foo
irb(main):011:2> end
irb(main):012:1> end
=> nil
irb(main):013:0> Article.singleton_methods
=> ["foo"]

Ruby uses singleton classes of classes instead of explicit
metaclasses, but unlike "normal" singleton classes, singleton classes
of classes get shared with subclasses

irb(main):014:0> class JournalArticle < Article
irb(main):015:1> end
=> nil
irb(main):016:0> JournalArticle.singleton_methods
=> ["foo"]
irb(main):017:0>

The class and singleton class of class hierarchies parallel each other.

irb(main):017:0> Article.instance_of?(Class)
=> true
irb(main):018:0> Article.class.instance_of?(Class.class)
=> true
irb(main):019:0> JournalArticle.class.instance_of?(Article.class)
=> true
irb(main):020:0> JournalArticle.class.instance_of?(Class.class)
=> true

In general, you can't subclass 'normal' singleton classes. The ruby
implementation does this for singleton classes of classes 'under the
covers.'

irb(main):021:0> a = "foo"
=> "foo"
irb(main):022:0> def a.singleton_method
irb(main):023:1> "Oh sole mio!"
irb(main):024:1> end
=> nil
irb(main):025:0> aclass = class << a; self;end
=> #<Class:#<String:0xb7c1ac88>>
irb(main):026:0> class B < aclass
irb(main):027:1> end
TypeError: can't make subclass of virtual class
from (irb):26


This double use of singleton classes can be confusing to some who
think that the 'singleton' in 'singleton class' means that it's not
shared with any other object.

Of course all this has probably gotten a tad deep for the context of
the OPs question.


--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denh...

Gavin Kistner

10/27/2006 4:17:00 PM

0

bparanj@gmail.com wrote:
> What is the purpose of singleton method? Why is singleton method
> defined on individual object instead of a class? TIA

class Person
def initialize( name )
@name = name
end
def do_the_hustle
puts %Q|#@name says, "doop dee doop de doop dee doop doo ..."|
end
def electric_slide
puts %Q|#@name says, "It's electric!"|
end
def dance
do_the_hustle
end
end

bob = Person.new( "Bob" )
jim = Person.new( "Jim" )
janice = Person.new( "Janice" )

def janice.dance
electric_slide
end

crowd = [ bob, jim, janice ]
crowd.each{ |person|
person.dance
}

#=> Bob says, "doop dee doop de doop dee doop doo ..."
#=> Jim says, "doop dee doop de doop dee doop doo ..."
#=> Janice says, "It's electric!"

With singleton methods, you can change the way a single object responds
to an event (or add unique functionality) without having to create a
whole new subclass just for that object.