Ruby/Inicjalizacja obiektów

Inicjalizacja obiektówEdytuj

Nasza klasa Owoc z poprzedniego rozdziału ma dwie zmienne instancji, jedną by opisywać rodzaj owocu, a drugą by opisywać jego kondycję. Ruby dostarcza eleganckiego sposóbu na zapewnienie, że zmienne instancji będą zawsze zainicjalizowane.

Metoda initializeEdytuj

Ilekroć Ruby tworzy nowy obiekt, szuka metody nazwanej initialize i wykonuje ją. Tak więc najprostszą rzeczą, którą możemy zrobić jest użycie metody initialize, by przypisać domyślne wartości do wszystkich zmiennych instancji.

class Owoc
  def initialize
    @rodzaj = "jablko"
    @stan = "dojrzaly"
  end
end

o = Owoc.new
p o #=> "dojrzaly owoc rodzaju: jablko"

Zmiana założeń w wymaganiaEdytuj

Będą takie przypadki, że domyślna wartość nie będzie miała wielkiego sensu. Czy jest w ogóle coś takiego jak domyślny rodzaj owocu? Bardziej pożądanym może być wymaganie, by każdy kawałek owocu posiadał swój własny rodzaj określony podczas tworzenia. By zrobić to, możemy dodać formalny argument do metody initialize. Z powodów, w które nie będziemy się teraz zagłębiać, argumenty które przekazujesz do metody new są dostarczane do initialize.

class Owoc
  def initialize(r)
    @rodzaj = r
    @stan = "dojrzaly"
  end
end

o = Owoc.new("mango")
p o #=> "dojrzaly owoc rodzaju: mango"
o2 = Owoc.new #=> ERR: (eval):1:in `initialize': wrong # of arguments(0 for 1)

Elastyczna inicjalizacjaEdytuj

Jak wyżej widzimy, gdy tylko argument dołączony jest do metody initialize, nie można go opuścić bez generowania błędu. Jeśli chcemy nieco bardziej dbać o użytkownika, możemy argumentom nadać od razu wartości domyślne.

class Owoc
  def initialize(r = "jablko")
    @rodzaj = r
    @stan = "dojrzaly"
  end
end

o = Owoc.new("mango")
p o  #=> "dojrzaly owoc rodzaju: mango"

o2 = Owoc.new
p o2 #=> "dojrzaly owoc rodzaju: jablko"

Wartości domyślnych możesz używać dla każdej metody, nie tylko initialize. Lista argumentów musi być tak ustawiona, by argumenty z domyślnymi wartościami były podawane jako ostanie.