Ruby/Inicjalizacja obiektów: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Szymon wro (dyskusja | edycje)
Nie podano opisu zmian
Szymon wro (dyskusja | edycje)
Nie podano opisu zmian
Linia 1:
== Inicjalizacja obiektów ==
 
Nasza klasa <tt>FruitOwoc</tt> z [[Ruby/Akcesory|poprzedniego rozdziału]] ma dwie zmienne instancji, jedną by opisywać rodzaj owocu, a drugą by opisywać jego kondycję. Zaraz po napisaniu indywidualnej metody <tt>inspect</tt> dla tej klasy, zdaliśmystało sobiesię sprawęjasne, że nie ma sensu by owoc niemusi posiadałposiadać tychte dwóchdwie własności. Na szczęście Ruby dostarcza sposób, byna zapewnićzapewnienie, że zmienne instancji będą zawsze zainicjalizowane.
 
=== Metoda <tt>initialize</tt> ===
 
Ilekroć Ruby tworzy nowy obiekt, szuka on metody nazwanej <tt>initialize</tt> i wykonuje ją. Tak więc najprostszą rzeczą, którą możemy zrobić jest użycie metody <tt>initialize</tt>, by umieścić domyślne wartości we wszystkich zmiennych instancji,. byW ten sposób metoda <tt>inspect</tt> miałbędzie miała cośtreść do powiedzeniawyświetlenia.
 
<pre>
ruby> class FruitOwoc
| def initialize
| @kindgatunek = "applejablko"
| @conditionstan = "ripedojrzaly"
| end
| end
nil
ruby> f4o4 = FruitOwoc.new
"adojrzaly ripeowoc applerodzaju: jablko"
</pre>
 
=== ZmienianieZmiana założeń w wymagania ===
 
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 <tt>initialize</tt>. Z powodów, w które nie będziemy się teraz zagłębiać, argumenty które przekazujesz do metody <tt>new</tt> są dostarczane do <tt>initialize</tt>.
 
<pre>
ruby> class FruitOwoc
| def initialize( k r)
| @kindrodzaj = kr
| @conditionstan = "ripedojrzaly"
| end
| end
nil
ruby> f5o5 = FruitOwoc.new "mango"
"adojrzaly ripeowoc rodzaju: mango"
ruby> f6o6 = FruitOwoc.new
ERR: (eval):1:in `initialize': wrong # of arguments(0 for 1)
</pre>
Linia 43:
<pre>
ruby> class Fruit
| def initialize(r k= "applejablko" )
| @kindrodzaj = kr
| @conditionstan = "ripedojrzaly"
| end
| end
nil
ruby> f5o5 = FruitOwoc.new "mango"
"adojrzaly ripeowoc rodzaju: mango"
ruby> f6o6 = FruitOwoc.new
"adojrzaly ripeowoc applerodzaju: jablko"
</pre>
 
Wartości domyślnych możesz używać dla każdej metody, nie tylko <tt>initialize</tt>. Lista argumentów musi być tak ustawiona, by argumenty z domyślnymi wartościami były podawane jako ostanie.
 
Czasami użytecznie jest dostarczyć kilku sposobów inicjalizacji obiektu. Chociaż jest to poza zakresem tego tutoriala, Ruby dostarcza refleksję obiektów oraz zmienne listy argumentów, które razem pozwalają na efektywne przeciążanie metod.
<noinclude>
{{ProstaNawigacja|spis=Ruby|poprzart=Ruby/Akcesory|poprz=Akcesory|nastart=Ruby/Pozostałe uwagi|nast=Pozostałe uwagi}}