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 --

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)..

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

···

On Thu, 15 Feb 2007, Steve Midgley wrote:

--
Q. What is THE Ruby book for Rails developers?
A. RUBY FOR RAILS by David A. Black (http://www.manning.com/black\)
    (See what readers are saying! http://www.rubypal.com/r4rrevs.pdf\)
Q. Where can I get Ruby/Rails on-site training, consulting, coaching?
A. Ruby Power and Light, LLC (http://www.rubypal.com)

Steve Midgley 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 Midgley (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

···

--
Posted via http://www.ruby-forum.com/\.

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 ?

···

On 2/15/07, Jimmy Kofler <koflerjim@mailinator.com> wrote:

> Posted by Steve Midgley (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

--
Posted via http://www.ruby-forum.com/\.

--
sur
http://expressica.com

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.

···

On 2/15/07, sur max <sur.max@gmail.com> wrote:

what say ?

On 2/15/07, Jimmy Kofler <koflerjim@mailinator.com> wrote:
>
> > Posted by Steve Midgley (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 http://www.ruby-forum.com/topic/94696
>
> Regards
> JK
>
> --
> Posted via http://www.ruby-forum.com/\.
>

--
sur
http://expressica.com

--
gnufied
-----------
There was only one Road; that it was like a great river: its springs
were at every doorstep, and every path was its tributary.
http://people.inxsasia.com/~hemant

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

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.

···

On 2/15/07, Pit Capitain <pit@capitain.de> wrote:

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.

--
gnufied
-----------
There was only one Road; that it was like a great river: its springs
were at every doorstep, and every path was its tributary.
http://people.inxsasia.com/~hemant

hemant schrieb:

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

···

On 2/15/07, Pit Capitain <pit@capitain.de> wrote: