Ruby/Zmienne klasowe

Zmienne klasoweEdytuj

Zmienne klasowe są współdzielone przez wszystkie instancje danej klasy. W Rubim, do oznaczania zmiennych klasowych używa się prefiksu @@. W poniższym przykładzie zmienna @@ilosc odzwierciedla całkowitą ilość instancji klasy Zwierze utworzonych w czasie działania programu.

class Zwierze
  @@ilosc = 0
  
  def initialize
    @@ilosc += 1
  end
  
  def self.populacja # metoda klasy
    @@ilosc
  end
  
  def populacja      # metoda instancji
    @@ilosc
  end
end

3.times do
  Zwierze.new
end

puts Zwierze.populacja # => 3
pies = Zwierze.new
puts pies.populacja    # => 4

@@ilosc jest zmienną klasową. W konstruktorze klasy Zwierze zwiększamy ją o jeden, czyli inkrementujemy (zmniejszanie o jeden nazywamy dekrementacją). Zapis @@ilosc += 1 jest równoważny zapisowi @@ilosc = @@ilosc + 1. Jak widzimy, każde kolejne utworzenie instancji klasy Zwierze powoduje zwiększenie o jeden zmiennej @@ilosc.

Metoda zdefiniowana jako self.populacja jest metodą klasową. Inną metodą tego rodzaju jest np. new. W naszym przykładzie równoważną metodą, ale nie klasową, jest metoda populacja. Obie zwracają wartość naszej zmiennej klasowej.