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>Fruit</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śmy sobie sprawę, że nie ma sensu by owoc nie posiadał tych dwóch własności. Na szczęście Ruby dostarcza sposób, by zapewnić, że zmienne instancji będą zawsze zainicjalizowane.
Our Fruit class from the previous chapter had two instance variables, one to describe the kind of fruit and another to describe its condition. It was only after writing a custom inspect method for the class that we realized it didn't make sense for a piece of fruit to lack those characteristics. Fortunately, ruby provides a way to ensure that instance variables always get initialized.
The initialize method
 
=== Metoda <tt>initialize</tt> ===
Whenever Ruby creates a new object, it looks for a method named initialize and executes it. So one simple thing we can do is use an initialize method to put default values into all the instance variables, so the inspect method will have something to say.
 
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, by <tt>inspect</tt> miał coś do powiedzenia.
 
<pre>
ruby> class Fruit
| def initialize
Linia 16 ⟶ 17:
ruby> f4 = Fruit.new
"a ripe apple"
</pre>
Changing assumptions to requirements
 
=== Zmienianie założeń w wymagania ===
There will be times when a default value doesn't make a lot of sense. Is there such a thing as a default kind of fruit? It may be preferable to require that each piece of fruit have its kind specified at the time of its creation. To do this, we would add a formal argument to the initialize method. For reasons we won't get into here, arguments you supply to new are actually delivered to initialize.
 
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 Fruit
| def initialize( k )
Linia 31 ⟶ 35:
ruby> f6 = Fruit.new
ERR: (eval):1:in `initialize': wrong # of arguments(0 for 1)
</pre>
Flexible initialization
 
=== Elastyczna inicjalizacja ===
 
Wyżej widzimy, że jak tylko argument dołączony jest do metody <tt>initialize</tt>, nie można go opuścić bez generowania błędu. Jeśli chcemy nieco bardziej dbać o użytkownika, możemy użyć argumentu wtedy, gdy jest on podany, lub wrócić do wartości domyslnych, gdy nie jest.
Above we see that once an argument is associated with the initialize method, it can't be left off without generating an error. If we want to be more considerate, we can use the argument if it is given, or fall back to default values otherwise.
 
<pre>
ruby> class Fruit
| def initialize( k="apple" )
Linia 46 ⟶ 53:
ruby> f6 = Fruit.new
"a ripe apple"
</pre>
 
Wartości domyślnych możesz używać dla każdej metody, nie tylko <tt>initialize</tt>. Lista argumentów musi być ustawiona, by argumenty z domyślnymi wartościami były podawane jako ostanie.
You can use default argument values for any method, not just initialize. The argument list must be arranged so that those with default values come last.
 
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.
Sometimes it is useful to provide several ways to initialize an object. Although it is outside the scope of this tutorial, ruby supports object reflection and variable-length argument lists, which together effectively allow method overloading.
<noinclude>
{{ProstaNawigacja|spis=Ruby|poprzart=Ruby/Akcesory|poprz=Akcesory|nastart=Ruby/Pozostałe uwagi|nast=Pozostałe uwagi}}