Сначала вы должны понять, что классы тоже являются экземплярами - экземплярами класса Class
.
Как только вы это поймете, вы сможете понять, что класс может иметь переменные экземпляра, связанные с ним, как обычные(читай: не класс) объект может.
Hello = Class.new
# setting an instance variable on the Hello class
Hello.instance_variable_set(:@var, "good morning!")
# getting an instance variable on the Hello class
Hello.instance_variable_get(:@var) #=> "good morning!"
Обратите внимание, что переменная экземпляра в Hello
полностью не связана и не отличается от переменной экземпляра в экземпляр из Hello
hello = Hello.new
# setting an instance variable on an instance of Hello
hello.instance_variable_set(:@var, :"bad evening!")
# getting an instance variable on an instance of Hello
hello.instance_variable_get(:@var) #=> "bad evening!")
# see that it's distinct from @var on Hello
Hello.instance_variable_get(:@var) #=> "good morning!"
Переменная класса , с другой стороны, является своего рода комбинацией двух вышеупомянутых, так как она доступна на самом Hello
и его экземплярах, а также на подклассах.из Hello
и их экземпляров:
HelloChild = Class.new(Hello)
Hello.class_variable_set(:@@class_var, "strange day!")
hello = Hello.new
hello_child = HelloChild.new
Hello.class_variable_get(:@@class_var) #=> "strange day!"
HelloChild.class_variable_get(:@@class_var) #=> "strange day!"
hello.singleton_class.class_variable_get(:@@class_var) #=> "strange day!"
hello_child.singleton_class.class_variable_get(:@@class_Var) #=> "strange day!"
Многие люди говорят, что следует избегать class variables
из-за странного поведения, описанного выше, и рекомендуют использовать class instance variables
вместо.