Статические переменные в рубине

Я только что узнал о статических переменных в 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/