@ Phrogz дал хорошее решение, но вы должны знать о нем больше.
Здесь вы создаете class-level instance variable
, который на самом деле не является переменной класса, но кого это волнует, потому что после инициализации переменной реального класса с тем же именем вы потеряете старую ссылку.
Чтобы проверить ложность, используйте приведенный выше код, но с массивом:
class Foo
@class_var = [42]
class << self
attr_accessor :class_var
end
end
b = [Foo.class_var]
Foo.class_var = 69
p b # still [[42]]
И у вас возникнет проблема при попытке получить переменную через @@
, которая должна была быть для переменной реального класса.
class Bar
@class_var = [42]
class << self
attr_accessor :class_var
end
def biz
self.class.class_var
end
def baz
@@class_var
end
end
p Bar.new.biz # self.class. is kinda a way to emulate the reference from outside
p Bar.new.baz # and exception, because you don't really have a class variable defined yet!