Статические переменные в рубине
Я только что узнал о статических переменных в php. Есть ли что-нибудь подобное в рубине?
Например, если мы хотим создать класс Student
и для каждого создаваемого объекта Student
, его номер идентификатора должен автоматически увеличиваться.
Я думал, что создание переменной класса будет статичным.
Ответы
Ответ 1
Переменные класса распределяются между всеми экземплярами (поэтому они называются переменными класса), поэтому они будут делать то, что вы хотите. Они также унаследованы, что иногда приводит к довольно запутанному поведению, но я не думаю, что это будет проблемой здесь. Вот пример класса, который использует переменную класса, чтобы подсчитать, сколько его экземпляров было создано:
class Foo
@@foos = 0
def initialize
@@foos += 1
end
def self.number_of_foos
@@foos
end
end
Foo.new
Foo.new
Foo.number_of_foos #=> 2
Ответ 2
Использование принятого ответа, поскольку определение статической переменной может быть опасным, и это обычная ошибка, которую я видел во множестве Ruby-кода.
Что-то вроде @@foos
разделяется между ALL подклассами. Однако большинство программистов ожидают, что статические переменные будут иметь область только внутри класса, где они определены.
Если вы ищете статические переменные в смысле большинства языков, где их область действия - только их собственный класс, посмотрите этот ответ SO
Также этот пост в блоге имеет приятный пример неожиданности, которое получат большинство программистов:
http://www.railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/