Creating a second instance of a singleton class?

dblack wrote:

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?

Thanks David - I think I understand what you're saying.. I'd happily settle for a *copy* of the instance's singleton class, but maybe I'm missing your point?

Another way to describe what I want to do:

1) create a class "Test"
2) create an instance of Test: "test1"
3) modify test1's class definition, creating a singleton class
4) Somehow "promote" or copy this singleton class to be a full fledged class as "Test2"
5) Create an instance of "Test2" as "test2"

Obviously #4 is the place where I'm stuck. B/c I'm stuck, I am (as you suggest) using module mix-in's to solve the problem, but it's less clean due to my context in the code.. It'll work, but not as nicely as if there were a method such as:

Test2 = test1.dup_singleton_class
test2 = Test2.new

I can't see why Ruby would object inherently to copying all the class methods of a singleton into a new class object (which is all I want - just a template of the singleton class's methods - no class variables or whatnot).

Thanks for the insight,

Steve

dblack wrote:

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?

Thanks David - I think I understand what you're saying.. I'd happily settle for a *copy* of the instance's singleton class, but maybe I'm missing your point?

Another way to describe what I want to do:

1) create a class "Test"
2) create an instance of Test: "test1"
3) modify test1's class definition, creating a singleton class
4) Somehow "promote" or copy this singleton class to be a full fledged class as "Test2"
5) Create an instance of "Test2" as "test2"

   harp:~ > cat a.rb
   require 'rubygems'
   require 'prototype'

   # 1)
   class Test; end

   # 2)
   test1 = Test.new

   # 3,4)
   Test2 = Class.new(test1.class){
     def new_method
       p 'no singleton class is needed'
     end
   }

   # 5)
   test2 = Test2.new

   test2.new_method

   harp:~ > ruby a.rb
   "no singleton class is needed"

Obviously #4 is the place where I'm stuck. B/c I'm stuck, I am (as you suggest) using module mix-in's to solve the problem, but it's less clean due to my context in the code.. It'll work, but not as nicely as if there were a method such as:

Test2 = test1.dup_singleton_class
test2 = Test2.new

I can't see why Ruby would object inherently to copying all the class methods of a singleton into a new class object (which is all I want - just a template of the singleton class's methods - no class variables or whatnot).

you have to have the the class variables if you have class methods. otherwise this

   class C
     @x = 42
     def self.x() @x end
   end

won't work

in strongly suspect there is an easier way to skin your cat. can you tell us,
not what you are trying to do, but why?

-a

路路路

On Thu, 15 Feb 2007, Steve Midgley wrote:
--
we can deny everything, except that we have the possibility of being better.
simply reflect on that.
- the dalai lama

and, if it is

   harp:~ > cat a.rb
   require 'rubygems'
   require 'prototype'

   # 1)
   class Test; end

   # 2)
   test1 = Test.new

   # 3)
   m = Module.new{
     def new_method
       p 'if a singleton class is needed'
     end
   }
   (class << test1; self; end).module_eval{ include m }

   # much easier - no singleton class needed here either
   # test1.extend m

   # 4)
   Test2 = Class.new(test1.class){ include m }

   # 5)
   test2 = Test2.new

   test2.new_method

   harp:~ > ruby a.rb
   "if a singleton class is needed"

-a

路路路

On Thu, 15 Feb 2007 Ara.T.Howard@noaa.gov wrote:

On Thu, 15 Feb 2007, Steve Midgley wrote:

dblack wrote:

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?

Thanks David - I think I understand what you're saying.. I'd happily settle for a *copy* of the instance's singleton class, but maybe I'm missing your point?

Another way to describe what I want to do:

1) create a class "Test"
2) create an instance of Test: "test1"
3) modify test1's class definition, creating a singleton class
4) Somehow "promote" or copy this singleton class to be a full fledged class as "Test2"
5) Create an instance of "Test2" as "test2"

harp:~ > cat a.rb
require 'rubygems'
require 'prototype'

# 1)
class Test; end

# 2)
test1 = Test.new

# 3,4)
Test2 = Class.new(test1.class){
   def new_method
     p 'no singleton class is needed'
   end
}

# 5)
test2 = Test2.new

test2.new_method

harp:~ > ruby a.rb
"no singleton class is needed"

--
we can deny everything, except that we have the possibility of being better.
simply reflect on that.
- the dalai lama

Hi --

Another way to describe what I want to do:

1) create a class "Test"
2) create an instance of Test: "test1"
3) modify test1's class definition, creating a singleton class
4) Somehow "promote" or copy this singleton class to be a full fledged class as "Test2"
5) Create an instance of "Test2" as "test2"

harp:~ > cat a.rb
require 'rubygems'
require 'prototype'

Are you sure you need those for your example?

I can't see why Ruby would object inherently to copying all the class methods of a singleton into a new class object (which is all I want - just a template of the singleton class's methods - no class variables or whatnot).

you have to have the the class variables if you have class methods. otherwise this

class C
   @x = 42
   def self.x() @x end
end

won't work

That's not a class variable, though -- but I'm a bit confused by
Steve's reference to class methods. Steve, why are you referring to
class methods? :slight_smile:

David

路路路

On Thu, 15 Feb 2007, ara.t.howard@noaa.gov wrote:

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)