This issue is not specific to opening a singleton class (class <<
), but applies to any case where the class being opened is a singleton class. You get the same output for:
module Mod1
O = Object.new.singleton_class
class O
C = 1
@@cv = 1
p Module.nesting,
constants(false),
class_variables(false),
Mod1.class_variables(false)
end
end
This explains why it works for nil
(and presumably true
and false
):
module Mod1
class << nil
C = 1
@@cv = 1
p Module.nesting,
constants(false),
class_variables(false),
Mod1.class_variables(false)
end
end
# [NilClass, Mod1]
# [:C]
# [:@@cv]
# []
I'm not sure if this class variable behavior is a bug or spec. If you consider it a bug, and say that class variables set inside a singleton class definition are set on the singleton class and not the outer nesting, then you would probably break the following code (and I'm guessing class << self
is much more common than class << some_other_object
):
module Mod1
class << self
@@cv = 1
end
def a
@@cv
end
end
FWIW, Ruby does allow you to set class variables on singleton classes via class_variable_get
/class_variable_set
, but you cannot access them via normal means:
module Mod1
singleton_class.class_variable_set(:@@cv, 1)
class << self
p class_variable_get(:@@cv)
@@cv
end
end
# 1
# NameError: uninitialized class variable @@cv in Mod1