Creating a second instance of a singleton class?

Hey,

I’ve been working on a weird little problem that I thought people on
this list might have a quick answer for (though the answer may be
“impossible!”):

[code starts]

class Test; end

test = Test.new

class << test
def new_method
puts “new method is accessible!”
end
end

test.new_method # works
test1 = test.dup # works but creates class from original class not
singleton
test2 = class << test; self.new; end; # blows up with “can’t create
instance of virtual class (TypeError)”

neither of these will therefore work

test1.new_method
test2.new_method

[code ends]

Basically, I have a class “Test” and I create an instance of it. I
modify the instance’s class definition (creating a singleton class
definition).

Now what I really want is to create a second instance of the newly
created singleton class. It appears to be impossible. A guess the name
singleton implies as much. But with all of Ruby’s tricks, I thought
there’d be a way to create a new instance of a singleton… Probably
there is but I don’t see it.

Hmm…

Steve

p.s. I’ve simplified the use-case way down - there are external reasons
why I want to modify the singleton and create an instance of it, rather
than modifying the parent class (or at least I think there are)…

Hi –

On Thu, 15 Feb 2007, Steve M. wrote:

neither of these will therefore work

implies as much. But with all of Ruby’s tricks, I thought there’d be a way to
create a new instance of a singleton… Probably there is but I don’t see it.

Hmm…

Steve

p.s. I’ve simplified the use-case way down - there are external reasons why I
want to modify the singleton and create an instance of it, rather than
modifying the parent class (or at least I think there are)…

I think the idea is for the object to have its own class, so if that
class ceased to be its own class, there would have to be some new
construct that was its own class, and you’d be back where you started
:slight_smile: So I don’t think it’s really possible in terms of the logic of
the model, and I can’t think of any way to do it.

Is it possible you could use modules to bring about the kind of thing
you’re looking for?

David

Steve M. schrieb:

I’ve been working on a weird little problem that I thought people on
this list might have a quick answer for (though the answer may be
“impossible!”):

Steve, don’t give up so fast, this is Ruby!

class Test; end

test = Test.new

class << test
def new_method
puts “new method is accessible!”
end
end

test.new_method # => new method is accessible!

test1 = test.clone
test1.new_method # => new method is accessible!

Regards,
Pit

Posted by Steve M. (stevemidgley) on 14.02.2007 20:24

Now what I really want is to create a second instance of the newly
created singleton class. It appears to be impossible. A guess the name
singleton implies as much. But with all of Ruby’s tricks, I thought
there’d be a way to create a new instance of a singleton… Probably
there is but I don’t see it.

Maybe also check out What's wrong with this snippet - Ruby - Ruby-Forum

Regards
JK

On 2/15/07, sur max [email protected] wrote:

hey guys !!
pls explain the meaning of Singleton Class
my perception is that it can only be associated with a single object, and
thats why its name so.
If you really wanna create more objects then isnt it better to redefine the
class with new functions.

Sorry to bore you , if you are already aware of this:

In Ruby when you add methods to an obj like this:

class << obj
def foobar; end
end

it creates a Singleton/Virtual class for that object, if singleton
class exists for that object, it would simply add method “foobar” to
that. So basically, Steve wants to copy this singleton class
associated with obj to the new class. Although its not clear to me,
how that would enable him to dynamically change the underlying
ActiveRecord table.

However, what puzzles me, how come #clone copies methods from
Singleton class as well? #dup won’t allow that. You can’t marshal
singleton and an attempt would throw error.

As usual Ara’s solution seems best, but if faced with similar
situation I would probably also consider Delegator pattern.

hey guys !!
pls explain the meaning of Singleton Class
my perception is that it can only be associated with a single object,
and
thats why its name so.
If you really wanna create more objects then isnt it better to redefine
the
class with new functions.

what say ?

hemant schrieb:

However, what puzzles me, how come #clone copies methods from
Singleton class as well? #dup won’t allow that. You can’t marshal
singleton and an attempt would throw error.

Works as documented:

ri Object#clone
ri Object#dup

It says: While +clone+ is used to duplicate an object, including its
internal state, +dup+ typically uses the class of the descendent object
to create the new instance.

Regards,
Pit

On 2/15/07, Pit C. [email protected] wrote:

It says: While +clone+ is used to duplicate an object, including its
internal state, +dup+ typically uses the class of the descendent object
to create the new instance.

Hey Pit, Internal State was not quite so clear to me so i read up in
ri and passed right over it, thanks for clearing it up.
Also, then may be we should be able to, marshal the damn singletons
also. But PickAxe says Singletons are literally invisible.

hemant schrieb:

On 2/15/07, Pit C. [email protected] wrote:

It says: While +clone+ is used to duplicate an object, including its
internal state, +dup+ typically uses the class of the descendent object
to create the new instance.

Hey Pit, Internal State was not quite so clear to me so i read up in
ri and passed right over it, thanks for clearing it up.
Also, then may be we should be able to, marshal the damn singletons
also. But PickAxe says Singletons are literally invisible.

Hemant, to be fair, I hadn’t thought of singleton classes, too, before
actually trying it. In retrospect, it makes kind of sense, that the
internal state of an object includes the singleton class’ methods. And
if its the business of the object’s class to do the #dup, then it is
clear that this can’t include singleton methods, because the class
doesn’t know about them.

Being able to marshal classes and singleton classes would be very nice,
but its not officially supported yet. There are workarounds to do this,
though.

Regards,
Pit