статические переменные в ruby - PullRequest
68 голосов
/ 10 марта 2010

Я только что узнал о статических переменных в php. Есть ли что-нибудь подобное в ruby?

Например, если мы хотим создать класс Student и для каждого создаваемого нами объекта student его идентификационный номер должен увеличиваться автоматически.

Я думал, что создание переменной класса в качестве статики подойдет.

Ответы [ 2 ]

104 голосов
/ 10 марта 2010

Переменные класса являются общими для всех экземпляров (именно поэтому они называются переменными класса), поэтому они будут делать то, что вы хотите. Они также наследуются, что иногда приводит к довольно запутанному поведению, но я не думаю, что это будет проблемой здесь. Вот пример класса, который использует переменную класса, чтобы подсчитать, сколько его экземпляров было создано:

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
14 голосов
/ 30 декабря 2013

Использование принятого ответа в качестве определения статической переменной может быть опасным, и это распространенная ошибка, которую я видел во многих кодах Ruby.

Что-то вроде @@foos является общим для подклассов ALL . Однако большинство программистов ожидают, что статические переменные будут иметь область действия только внутри класса, в котором они определены.

Если вы ищете статические переменные в смысле большинства языков, где их область видимости - только их собственный класс, посмотрите на этот ответ SO

Также в этом блоге есть хороший пример сюрприза, который получат большинство программистов:

http://www.railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...