I’m doing the following, and expecting TestClass.my_var to return"my_var_here":
irb(main):001:0> def create_a_class class_name, my_var
irb(main):002:1> klass = Object.const_set class_name, Class.new
irb(main):003:1> klass.class_variable_set :@@my_var, my_var
irb(main):004:1> klass.instance_eval do
irb(main):005:2* def my_var
irb(main):006:3> @@my_var
irb(main):007:3> end
irb(main):008:2> end
irb(main):009:1> klass
irb(main):010:1> end
=> nil
irb(main):011:0> create_a_class "TestClass", "my_var_here"
=> TestClass
Instead, I get this:
irb(main):012:0> TestClass.my_var
(irb):6: warning: class variable access from toplevel
NameError: uninitialized class variable @@my_var in Object
from (irb):6:in `my_var'
from (irb):12
from C:/Ruby193/bin/irb:12:in `<main>'
What am I doing wrong? Any input would be appreciated.
EDIT: I’ve tried doing it like this and it seems to work, but it doesn’t really feel like The Ruby Way™ of doing it (also I’d rather not have those pesky warnings)
irb(main):001:0> def create_a_class class_name, _my_var
irb(main):002:1> klass = Object.const_set class_name, Class.new
irb(main):003:1> klass.instance_eval do
irb(main):004:2* @@my_var = _my_var
irb(main):005:2> def my_var
irb(main):006:3> @@my_var
irb(main):007:3> end
irb(main):008:2> end
irb(main):009:1> klass
irb(main):010:1> end
=> nil
irb(main):011:0> create_a_class "TestClass", "my_var_here"
(irb):4: warning: class variable access from toplevel
=> TestClass
irb(main):012:0> TestClass.my_var
(irb):6: warning: class variable access from toplevel
=> "my_var_here"
First of all? Why are you using class variables? You know you can use instance variables on classes too? They are much more predictable.
Class variables are looked up lexically:
If you really want to use class variables, then you’ll have to use #eval (of some form) to define the method: