Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Creating a second instance of a singleton class?

Reply
Thread Tools

Creating a second instance of a singleton class?

 
 
Steve Midgley
Guest
Posts: n/a
 
      02-14-2007
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)..


 
Reply With Quote
 
 
 
 
dblack@wobblini.net
Guest
Posts: n/a
 
      02-14-2007
Hi --

On Thu, 15 Feb 2007, Steve Midgley wrote:

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

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

 
Reply With Quote
 
 
 
 
Pit Capitain
Guest
Posts: n/a
 
      02-14-2007
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

 
Reply With Quote
 
Jimmy Kofler
Guest
Posts: n/a
 
      02-15-2007
> 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/.

 
Reply With Quote
 
hemant
Guest
Posts: n/a
 
      02-15-2007
On 2/15/07, sur max <(E-Mail Removed)> 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.


> what say ?
>
> On 2/15/07, Jimmy Kofler <(E-Mail Removed)> 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

 
Reply With Quote
 
Pit Capitain
Guest
Posts: n/a
 
      02-15-2007
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

 
Reply With Quote
 
hemant
Guest
Posts: n/a
 
      02-15-2007
On 2/15/07, Pit Capitain <(E-Mail Removed)> 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.


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.

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

 
Reply With Quote
 
Pit Capitain
Guest
Posts: n/a
 
      02-15-2007
hemant schrieb:
> On 2/15/07, Pit Capitain <(E-Mail Removed)> 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

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Singleton methods without the singleton class Charles Oliver Nutter Ruby 4 03-22-2010 10:46 PM
Singleton object vs. enhancing singleton class Paul McMahon Ruby 3 06-09-2008 06:05 AM
Singleton Modules rather than Singleton Classes Trans Ruby 12 09-14-2007 06:45 AM
Singleton - Whether Cloneable overrides Singleton Proton Projects - Moin Java 4 03-27-2007 02:59 AM
Singleton classes and Singleton pattern Wilhelm Ruby 1 10-11-2006 01:08 PM



Advertisments