Ruby/Akcesory: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
Szymon wro (dyskusja | edycje) |
Szymon wro (dyskusja | edycje) Nie podano opisu zmian |
||
Linia 3:
=== Czym jest akcesor? ===
Krótko omówiliśmy zmienne instancji we [[Ruby/Zmienne instancji|wcześniejszym rozdziale]], ale jeszcze za
Wyróżniamy dwa rodzaje akcesorów: ''piszące'' (ang. ''writer''<ref>W innych językach programowania powszechnie funkcjonuje nazwa ''setter''.</ref>) i ''czytające'' (ang. ''reader''<ref>W innych językach programowania - ''getter''.</ref>).
<source lang="ruby">
class Owoc
def zapisz_rodzaj(r) # akcesor piszacy
@rodzaj = r
end
def czytaj_rodzaj # akcesor czytajacy
@rodzaj
end
end
o1 = Owoc.new
# uzycie akcesora piszacego:
o1.zapisz_rodzaj("brzoskwinia")
# uzycie akcesora czytajacego:
o1.czytaj_rodzaj #=> "brzoskwinia"
</source>
Gdybyśmy wpisali powyższy kod do ''irba'', moglibyśmy zastosować następujący sposób inspekcji:
<pre>
irb(main):011:0> o1
=> #<Owoc:0x2e47044 @rodzaj="brzoskwinia">
</pre>
Proste prawda? Możemy przechowywać i odczytywać informację o tym, na jaki owoc patrzymy. Ale nasze nazwy metod są nieco rozwlekłe. W następującym przykładzie są już nieco bardziej zwięzłe i konwencjonalne:
<source lang="ruby">
def
end
o2 = Owoc.new o2.rodzaj = "banan"
</source>
=== Metoda <tt>inspect</tt> ===
Jest tu potrzebna krótka dygresja. Z pewnością zauważyłeś, że jeżeli próbujemy spojrzeć na obiekt w ''irbie'' bezpośrednio, pokazuje się nam coś zagadkowego w rodzaju <tt>#<jakisObiekt: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.
<source lang="ruby">
</source>
Podobną metodą jest metoda <tt>to_s</tt> (ang. ''convert to string'' - zamień na łańcuch), która jest używana 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 formowanie wyjścia programu. ''
<pre>
Linia 91 ⟶ 93:
|}
Korzystając z tabeli uporządkujmy naszą klasę i dodajmy informację na temat świeżości. Najpierw automatycznie wygenerujemy akcesory:
<source lang="ruby">
attr_accessor :gatunek
def
"#{@stan} owoc rodzaju: #{@gatunek}"
end
o = Owoc.new
o.gatunek
o.stan = "dojrzaly"
p o #=> dojrzaly owoc rodzaju: banan
</source>
=== Więcej zabawy z owocem ===
Jeżeli nikt nie zjadł naszego dojrzałego owocu, może należałoby pozwolić, by czas zebrał swoje żniwo
<source lang="ruby">
p o #=> dojrzaly owoc rodzaju: banan
o.uplywa_czas
p o #=> gnijacy owoc rodzaju: banan
</source>
W [[Ruby/Inicjalizacja obiektów|następnym rozdziale]] zobaczymy, jak zapewnić, by już w momencie utworzenia <tt>Owoc</tt> miał zdefiniowany rodzaj i stan.
<noinclude>
{{Przypisy}}
|