J
Jamie Quint
I am using define_method inside a module to dynamically create a class
after the module is mixed in. The module is writing out class variables
for the class it is mixed into (yes I am aware that class variables are
generally frowned upon but they are necessary in this instance) and then
subsequently trying to access them through the method being created with
define_method.
The problem here is that define method is not able to access the class
variables through class_variable_get or through accessing them directly.
In the first case it fails because 'class_variable_get' is not a method
on the class (oMethodError: undefined method ‘class_variable_get’ for
#<Foo:0x100124638>) In the second instance it fails because it thinks
the class variable is uninitialized (NameError: uninitialized class
variable @@c in M)
It seems to be evaluating the '@@c' call in the context of the module
and the class_variable_get call in the context of the class in which
define_method is being called after it is mixed in. Does anyone know how
I can get at the class variable here in define_method? Sample code
below:
Best,
Jamie
module M
def cv(methodname)
if class_variable_defined?@@c)
classvar = class_variable_get@@c)
classvar[rand(10000)] = "random"
class_variable_set@cc,classvar)
else
class_variable_set@@c,{})
end
define_method(methodname.to_sym) do
# need to be able to get class variables for this class
# @@c does not work because it tries to get the variable for the
module and it exists only in the class
#class_variable_get@@c) #does not work because its an invalid
class method
#@cc and class_variable_get@@c) are getting evaluated in
different contexts which is strange
end
end
end
class Foo
extend M
cv("mfoo")
end
f = Foo.new
f.mfoo # want this to be able to access and operate on class variables
after the module is mixed in. The module is writing out class variables
for the class it is mixed into (yes I am aware that class variables are
generally frowned upon but they are necessary in this instance) and then
subsequently trying to access them through the method being created with
define_method.
The problem here is that define method is not able to access the class
variables through class_variable_get or through accessing them directly.
In the first case it fails because 'class_variable_get' is not a method
on the class (oMethodError: undefined method ‘class_variable_get’ for
#<Foo:0x100124638>) In the second instance it fails because it thinks
the class variable is uninitialized (NameError: uninitialized class
variable @@c in M)
It seems to be evaluating the '@@c' call in the context of the module
and the class_variable_get call in the context of the class in which
define_method is being called after it is mixed in. Does anyone know how
I can get at the class variable here in define_method? Sample code
below:
Best,
Jamie
module M
def cv(methodname)
if class_variable_defined?@@c)
classvar = class_variable_get@@c)
classvar[rand(10000)] = "random"
class_variable_set@cc,classvar)
else
class_variable_set@@c,{})
end
define_method(methodname.to_sym) do
# need to be able to get class variables for this class
# @@c does not work because it tries to get the variable for the
module and it exists only in the class
#class_variable_get@@c) #does not work because its an invalid
class method
#@cc and class_variable_get@@c) are getting evaluated in
different contexts which is strange
end
end
end
class Foo
extend M
cv("mfoo")
end
f = Foo.new
f.mfoo # want this to be able to access and operate on class variables