Hi,
I'm trying to code in Ruby something that looks like this, when reduced and highly simplified:
···
------------------------------------------
class B
puts "B class init"
@@dynamic_method_outputs = Array.new
def initialize
puts "B instance init"
end
def B.add_to_dynamic_method_output(val)
@@dynamic_method_outputs << val
method_def = "def dynamic_method() "
@@dynamic_method_outputs.each do |v|
method_def << "puts #{v} \n"
end
method_def << "end"
self.class_eval method_def
end
end
class D1 < B
add_to_dynamic_method_output 123
add_to_dynamic_method_output 456
end
class D2 < B
add_to_dynamic_method_output 789
end
d1 = D1.new
d1.dynamic_method
d2 = D2.new
d2.dynamic_method
------------------------------------------
The output of this is:
B class init
B instance init
123
456
B instance init
123
456
789
As the code suggest, what I except is:
B class init
B instance init
123
456
B instance init
789
In other words, the global @@dynamic_method_outputs is not cleared between D1 and D2 class definitions.
The only trick I could find for the moment is to use a dummy instanciation, but it is still not really clean, and prone to errors.
------------------------------------------
class B
puts "B class init"
@@dynamic_method_outputs = Array.new
def initialize
puts "B instance init"
@@dynamic_method_outputs.clear
end
def B.add_to_dynamic_method_output(val)
@@dynamic_method_outputs << val
method_def = "def dynamic_method() "
@@dynamic_method_outputs.each do |v|
method_def << "puts #{v} \n"
end
method_def << "end"
self.class_eval method_def
end
end
class D1 < B
add_to_dynamic_method_output 123
add_to_dynamic_method_output 456
end
D1.new
class D2 < B
add_to_dynamic_method_output 789
end
D2.new
d1 = D1.new
d1.dynamic_method
d2 = D2.new
d2.dynamic_method
789
------------------------------------------
Output is here:
B class init
B instance init
B instance init
B instance init
123
456
B instance init
789
Does anyone have a better idea?
Philippe