Переменные класса
Переменные класса связаны с классами, а не с экземплярами. Перед ними ставятся два знака «at» (@@). Например:
class Counter
@@instances = 0
def initialize
@@instances += 1
end
def self.instances
@@instances
end
end
Counter.instances # => 0
Counter.new
Counter.new
Counter.new
Counter.instances # => 3
Переменные класса можно считывать и изменять из методов класса или методов экземпляра.
Их тип определяется с помощью алгоритма глобального вывода типов.
Переменные класса наследуются подклассами следующим образом: их тип остаётся тем же, но у каждого класса своё значение во время выполнения. Например:
class Parent
@@numbers = [] of Int32
def self.numbers
@@numbers
end
end
class Child < Parent
end
Parent.numbers # => []
Child.numbers # => []
Parent.numbers << 1
Parent.numbers # => [1]
Child.numbers # => []
Переменные класса также могут быть связаны с модулями и структурами. Как и выше, они наследуются типами, включающими эти модули или являющимися подклассами этих классов.
To the extent possible under law, the persons who contributed to this workhave waived
all copyright and related or neighboring rights to this workby associating CC0 with it.
https://crystal-lang.org/reference/1.2/syntax_and_semantics/class_variables.html