Creating a second instance of a singleton class?

Discussion in 'Ruby' started by Steve Midgley, Feb 14, 2007.

  1. 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)..
    Steve Midgley, Feb 14, 2007
    #1
    1. Advertising

  2. Steve Midgley

    Guest

    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)
    , Feb 14, 2007
    #2
    1. Advertising

  3. Steve Midgley

    Pit Capitain Guest

    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
    Pit Capitain, Feb 14, 2007
    #3
  4. Steve Midgley

    Jimmy Kofler Guest

    > 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/.
    Jimmy Kofler, Feb 15, 2007
    #4
  5. Steve Midgley

    hemant Guest

    On 2/15/07, sur max <> 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 <> 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, Feb 15, 2007
    #5
  6. Steve Midgley

    Pit Capitain Guest

    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
    Pit Capitain, Feb 15, 2007
    #6
  7. Steve Midgley

    hemant Guest

    On 2/15/07, Pit Capitain <> 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
    hemant, Feb 15, 2007
    #7
  8. Steve Midgley

    Pit Capitain Guest

    hemant schrieb:
    > On 2/15/07, Pit Capitain <> 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
    Pit Capitain, Feb 15, 2007
    #8
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Sridhar R
    Replies:
    14
    Views:
    1,396
    =?iso-8859-1?Q?Fran=E7ois?= Pinard
    Feb 10, 2004
  2. Martin P. Hellwig
    Replies:
    1
    Views:
    373
    Martin P. Hellwig
    Mar 26, 2010
  3. Caleb Tennis
    Replies:
    3
    Views:
    157
  4. Paul McMahon
    Replies:
    3
    Views:
    203
    David A. Black
    Jun 9, 2008
  5. Charles Oliver Nutter

    Singleton methods without the singleton class

    Charles Oliver Nutter, Mar 15, 2010, in forum: Ruby
    Replies:
    4
    Views:
    199
    Charles Oliver Nutter
    Mar 22, 2010
Loading...

Share This Page