From: ts Date: 2002-11-20T23:36:53+09:00 Subject: Re: Need help dynamically creating classes. >>>>> "P" == Paul Gregory writes: P> Next question: is it possible to specify arguments to the initialize P> method when defining it with this code? Well, you can write pigeon% cat b.rb #!./ruby class SceneObject def initialize(scale, &generate) @scale = scale @generate = generate end alias init initialize def render instance_eval(&@generate) end end def defineClass(name, &block) Object.const_set(name, Class.new(SceneObject)).instance_eval do define_method(:initialize) {|scale| init(scale, &block) } end end defineClass("MyObject") do puts "render some object #{self.inspect}" end a = MyObject.new(1.5) a.render pigeon% pigeon% b.rb render some object #, @scale=1.5> pigeon% P> I'd like to be able to do something like... P> defineClass("MyObject", scale) { P> scale(scale) P> puts(scale) P> } but in this case you must write it defineClass("MyObject") { scale(@scale) puts(@scale) } Or you can make someting more complex pigeon% cat b.rb #!./ruby class SceneObject def initialize(params, &generate) params.each do |k, v| class << self; self end.send(:attr_accessor, k) send("#{k}=", v) end @generate = generate end alias init initialize def render instance_eval(&@generate) end end def defineClass(name, var, &block) Object.const_set(name, Class.new(SceneObject)).instance_eval do define_method(:initialize) {|scale| init(var => scale, &block) } end end defineClass("MyObject", "scale") do puts "render some object #{self.inspect}" p self.scale end a = MyObject.new(1.5) a.render pigeon% pigeon% b.rb render some object #> 1.5 pigeon% but you must prefix `scale' with `self.' otherwise ruby interpret it as a local variable. Guy Decoux