Dynamic class names

Is it possible to create classes with a dynamic name? Example:

name = "Test"

class name # this fails
def write
    puts "TEST"
  end
end

puts Object::const_get(name).new.write # => "TEST"

Martin Boese wrote:

Is it possible to create classes with a dynamic name? Example:

name = "Test"

class name # this fails
def write
    puts "TEST"
  end
end

puts Object::const_get(name).new.write # => "TEST"

Yes. Here is an overview on metaprogramming, and two ways to create
classes dynamically:

- -- Phillip Gawlowski

sure

c = Class::new {
  def a; 41 end
}
d = Class::new(c) {
  def a; super.succ end
}
d.new.a --> 42

HTH
Robert

···

On Wed, Apr 2, 2008 at 11:18 AM, Martin Boese <boesemar@gmx.de> wrote:

Is it possible to create classes with a dynamic name? Example:

name = "Test"

class name # this fails
  def write
    puts "TEST"
  end
end

puts Object::const_get(name).new.write # => "TEST"

--
http://ruby-smalltalk.blogspot.com/

---
Whereof one cannot speak, thereof one must be silent.
Ludwig Wittgenstein

No... I mean the 'Name' of a class or module (that what you get with
object.class.name). The doc of Class::new (ri) describes how it works:

You can give a class a name by assigning the class object to a constant.

...but still that doesn't allow me to set the initial name when _defining_ the
class.

I am aware that this can be done using eval with the complete class definition
as a string - which is also not what I want.

The reason is to avoid name clashes of a larger program. So I am thinking of
using some central instance to assign names and address specific types of
classes.

Martin

···

On Wednesday 02 April 2008 10:58:52 Phillip Gawlowski wrote:

Martin Boese wrote:
> Is it possible to create classes with a dynamic name? Example:
>
> name = "Test"
>
> class name # this fails
> def write
> puts "TEST"
> end
> end
>
> puts Object::const_get(name).new.write # => "TEST"

Yes. Here is an overview on metaprogramming, and two ways to create
classes dynamically:

Ola Bini: Programming Language Synchronicity: Ruby Metaprogramming techniques

-- Phillip Gawlowski

Thanks, that's what I was looking for.

That example of mine now works:

name = 'Test'
Object::const_set(name.intern, Class::new do
def write
   puts "TEST"
end
end
)
Object::const_get(name).new.write # writes => "TEST"

martin

···

On Wednesday 02 April 2008 12:19:33 Robert Dober wrote:

On Wed, Apr 2, 2008 at 11:18 AM, Martin Boese <boesemar@gmx.de> wrote:
> Is it possible to create classes with a dynamic name? Example:
>
> name = "Test"
>
> class name # this fails
> def write
> puts "TEST"
> end
> end
>
> puts Object::const_get(name).new.write # => "TEST"

sure

c = Class::new {
  def a; 41 end
}
d = Class::new(c) {
  def a; super.succ end
}
d.new.a --> 42

HTH
Robert