Singleton object vs. enhancing singleton class

In ruby, as class are singleton objects, does anyone have any ideas when
a a singleton object should be used vs. simply adding methods to the
class? For example,

class Foo
include Singleton
def bar
end
end

vs.

class Foo
def self.bar
end
end

On Sunday 08 June 2008 22:35:25 Paul McMahon wrote:

In ruby, as class are singleton objects, does anyone have any ideas when
a a singleton object should be used vs. simply adding methods to the
class?

I always include Singleton, but I see what you mean. A better way might
be to
do it with modules:

module Foo
def self.bar
end
end

One example is mixins, though. For example, here:

class Foo
def self.bar
end
end

A mixin would almost certainly be expecting to be mixed via “include”
here,
not “extend”. This might not always matter, but some mixins will define
things like self.included, and won’t work at all if you try to extend
them
instead.

However, a mixin which expected “extend” would still work on a Singleton
object:

class Foo
include Singleton
def bar
end
end
Foo.instance.extend SomeMixin

I think the main reason for doing Singleton, though, is that it
expresses
intent better, and it prevents the class from being instantiated –
sure,
there are ways around it, but you’re not going to accidentally call
Foo.new
without getting an error.

In reply to myself:

it prevents the class from being instantiated

To clarify – prevents it from being instantiated again.

Hi –

On Mon, 9 Jun 2008, Paul McMahon wrote:

In ruby, as class are singleton objects, does anyone have any ideas when

I’d just say: classes are objects. Like other objects, they can have
methods added to them on a per-object basis (give or take the fact
that “per-object” in the case of a class actually includes
subclasses).

class Foo
def self.bar
end
end

I don’t see these techniques as addressing the same problem or being
likely candidates to replace each other. I’d go by what you need. If
you need a class that has only one instance, then use Singleton. If
you’ve got a situation where there’s class-level (as opposed to
instance-level) knowledge involved, then use a class method.

David