NameError is raised when use class variables in Refinements
Sorry in advance if other ticket exists.
In a case, Reference to class variables raises unnatural NameError.
A class variable is defined in a module.
And include the module in "refine" block.
Refined method cannot use the class variable, and raises NameError.
module FooMod @@foo_mod1 = 1 def foo_mod1 p self.class.class_variable_get("@@foo_mod1") end end module FooMod2 @@foo_mod2 = 1 def foo_mod2 p self.class.class_variable_get("@@foo_mod2") end end class Foo @@hoge = 1 include FooMod def hoge1 p @@hoge end end module Ext refine Foo do def hoge2 p self.class.class_variable_get("@@hoge") end include FooMod2 end end using Ext Foo.new.hoge1 # => 1 OK Foo.new.hoge2 # => 1 OK Foo.new.foo_mod1 # => 1 OK Foo.new.foo_mod2 # => uninitialized class variable @@foo_mod2 in Foo (NameError)
Is This behavior Refinements spec? or bug?
Updated by shevegen (Robert A. Heiler) about 4 years ago
I have no idea if this is a bug or a feature, but I believe it seems more
of a bug. The @@variables should be accessible within the namespace of
the specific class right? So it should be viewable in a refinement too -
but admittedly, I have no idea about the specification of refinements
and I also have not been using @@variables in ages either. I just think
that this is more likely to be a bug.
Updated by shugo (Shugo Maeda) about 1 year ago
I'm not against the change, if there is no implementation difficulty.
However, class variables are not accessible in class_eval either, and reflection APIs can be used as a workaround as you suggested, so the change may not be necessary.