Ruby/Akcesory: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
m nav |
Szymon wro (dyskusja | edycje) Nie podano opisu zmian |
||
Linia 1:
== Akcesory ==
=== Czym jest akcesor? ===
Krótko omówiliśmy zmienne instancji we [[Ruby/Zmienne instancji|wcześniejszym rozdziale]], ale za wiele jeszcze z nimi nie robiliśmy. Zmienne instancji obiektu są jego atrybutami, to te rzeczy, które odróżniają obiekt od innych obiektów tej samej klasy. To ważne, by móc zapisywać i odczytywać te atrybuty; a robią to metody nazywane ''akcesorami atrybutów''. Zobaczymy za moment, że nie musimy pisać akcesorów bezpośrednio, ale teraz przejdźmy przez wszystkie etapy. Wyróżniamy dwa rodzaje akcesorów: ''zapisujące'' i ''odczytujące''.
<pre>
ruby> class Fruit
| def set_kind(k) # a writer
Linia 20 ⟶ 23:
ruby> f1 # inspect the object
#<Fruit:0xfd7e7c8c @kind="peach">
</pre>
Wystarczająco proste; możemy przechowywać i odczytywać informację o tym, na jaki owoc patrzmy. Ale nasze nazwy metod są nieco rozwlekłe. W następującym przykładzie są nieco bardziej zwięzłe oraz bardziej konwencjonalne:
<pre>
ruby> class Fruit
| def kind=(k)
Linia 38 ⟶ 43:
ruby> f2.kind
"banana"
</pre>
=== Metoda <tt>inspect</tt> ===
Jest tu potrzebna krótka dygresja. Z pewnością zauważyłeś, że jeżeli próbujemy spojrzeć na obiekt bezpośrednio, pokazuje się nam coś zagadkowego w rodzaju <tt>#<anObject:0x83678></tt>. To jest po prostu domyślne zachowanie i oczywiście możemy je zmienić. Wszystko, co musimy zrobić to dodać metodę o nazwie <tt>inspect</tt>. Powinna ona zwracać łańcuch, który opisuje obiekt w jakiś sensowny sposób, włączając stany części lub wszystkich jego zmiennych instancji.
<pre>
ruby> class Fruit
| def inspect
Linia 50 ⟶ 58:
ruby> f2
"a fruit of the banana variety"
</pre>
Podobną metodą jest metoda <tt>to_s</tt> (ang. ''convert to string'' - zamień na łańcuch), która jest używane gdy drukujemy obiekt. Ogólnie rzecz biorąc, możesz traktować <tt>inspect</tt> jako narzędzie, gdy piszesz i debugujesz programy, natomiast <tt>to_s</tt> jako sposób na oczyszczenie wyjścia programu. ''eval.rb'' używa <tt>inspect</tt> ilekroć wyświetla wyniki. Możesz użyć metody <tt>p</tt> by łatwo debugować wyjście z programów.
<pre>
# Te dwie linie są równoważne:
p anObject
puts anObject.inspect
</pre>
Making accessors the easy way
|