[prev in list] [next in list] [prev in thread] [next in thread] 

List:       ruby-talk
Subject:    Re: Singleton Class or Module Functions?
From:       "David A. Black" <dblack () wobblini ! net>
Date:       2004-10-21 2:34:26
Message-ID: Pine.LNX.4.44.0410201925090.18591-100000 () wobblini
[Download RAW message or body]

Hi --

On Thu, 21 Oct 2004, trans.  (T. Onoma) wrote:

> On Wednesday 20 October 2004 08:44 pm, David A. Black wrote:
> | Hi --
> |
> | On Thu, 21 Oct 2004, trans.  (T. Onoma) wrote:
> | > I've come across this seemingly indistinct option too many times now.
> | > Which is better? Why choose one over the other?
> | >
> | >   module ThisInstance
> | >     class << self
> | >       def hello
> | >         puts "Hello World!"
> | >       end
> | >     end
> | >   end
> | >
> | >   ThisInstance.ameth
> | >
> | > or
> | >
> | >   class This
> | >     include Singleton
> | >     def hello
> | >       puts "Hello World!"
> | >     end
> | >   end
> | >
> | >   This.instance.ameth
> |
> | (Do you mean 'hello' rather than 'ameth'?)
> 
> Yes.
> 
> | I'm not sure what you mean.  What's the connection between them?
> 
> It seems the above two types of constructs can be used interchangeably. They 
> both have but one "instance". The both have the same access to methods. The 
> singleton has to be instantiated the first go around, but since that's behind 
> the scenes, that doesn't really make any difference (or does it?).

It depends what you mean by "difference" :-)  It's true that in both
cases you have an object with sole access to a method.  But that's
true for any singleton method -- for example:

  a = Object.new
  def a.hello; puts "Hello World!"; end

In any such case, I suppose you could do:

  class A; include Singleton; def hello.... end; end
  a = A.instance

But that seems like the long way around.  

I guess another difference is that adding a method on a singleton
basis to an object (as in your first example and my first example)
means that you can control difference in a granular way; that is, you
could have two objects of the same class, whose types were different
*only* with respect to one method:

  a = Something.new
  b = Something.new

  def a.hello; ...; end

A Singleton-including class does not allow for this kind of relation
between two objects.


David

-- 
David A. Black
dblack@wobblini.net


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic