Ruby/Iteratory: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Szymon wro (dyskusja | edycje)
mNie podano opisu zmian
Szymon wro (dyskusja | edycje)
Nie podano opisu zmian
Linia 1:
== Iteratory ==
 
Iteratory nie są oryginalnym pojęciem Rubiego. Występują one w powszechnym użyciupowszechnie w językach programowania zorientowanych obiektowo. WystępująUżywane są również w Lispie, choć nie są tam nazywane iteratorami. Jednakże koncepcja iteratorów jest wielu osobom obca, więc zostanie ona tutaj wyjaśniona nieco bardziej szczegółowo.
 
Czasownik "iterować" oznacza wykonywać tę samą czynność wiele razy, tak więc iterator jest czymś co wykonuje tę samą rzecz wiele razy.
Linia 26:
Wszystkie pliki źródłowe i nagłówkowe języka C w bieżącym katalogu są przetwarzane i powłoka systemowa bierze na siebie detale dotyczące wskazywania i podstawiania po kolei wszystkich nazw plików, jedna po drugiej. To chyba działa na wyższym poziomie niż C, nie sądzisz?
 
Trzeba zauważyć jeszcze jedno: często język dostarcza iteratorów dla typów wbudowanych, ale rozczarowujebudzi rozczarowanie gdy okazuje się, że musimy wracać z powrotem do pętli nisko poziomowych by iterować nasze własne typy danych. W programowaniu zorientowanym obiektowo (OOP - ang. ''Object-Oriented Programming''), użytkownicy zazwyczaj definiują własnedużo typywłasnych typów danych jeden za drugim, więc to może być całkiem poważnympoważny problememproblem.
 
Tak więc każdyKażdy język wspierający OOP zawiera jakieś udogodnienia dodotyczące iterowania. Niektóre języki dostarczają w tym celu specjalnych klas;, natomiast Ruby pozwala na definiowanie iteratorów bezpośrednio.
 
Typ <tt>String</tt> Rubiego posiada kilka użytecznych iteratorów:
Linia 38:
</pre>
 
<tt>each_byte</tt> to iterator wskazujący na każdy znak w łańcuchu. Każdy znak jest podstawiany do zmiennej lokalnej <tt>c</tt>. To samo można przełożyć na coś bardziej przypominającego kod C...
 
<pre>
Linia 50:
</pre>
 
... jednakże, iterator <tt>each_byte</tt> jest koncepcyjnie prostszy, jak i wydaje się, że działałby nadal nawet gdyby klasa <tt>String</tt> uległa w przyszłości radykalnym modyfikacjom. Dużą zaletą iteratorów jest to, że zachowują one swoje poprawne działanie na przekór takim radykalnym zmianom. I w rzeczy samej, jestJest to charakterystyczna cecha dobrego kodu w ogólności. (Tak, miej cierpliwość, niebawem będziemy mówić również o tym czym są klasy.)
 
Innym iteratorem klasy <tt>String</tt> jest <tt>each_line</tt>.
Linia 62:
</pre>
 
Zadania które pochłonęływymagałyby by większośćdużego wysiłku w C (wyszukiwanie ograniczników linii, generowanie podłańcuchów, itd.) z użyciem iteratorów mogąmożna byćwykonać łatwobardzo rozwiązanełatwo.
 
Instrukcja <tt>for</tt> pojawiająca się w [[Ruby/Struktury sterujące|poprzednim rozdziale]] dokonywała iteracji przez użycie iteratora <tt>each</tt>. Iterator <tt>each</tt> klasy <tt>String</tt> działa w ten sam sposób jak <tt>each_line</tt>, więc przepiszmy powyższy przykład z <tt>for</tt>:
Linia 99:
234
 
<tt>yield</tt> jest wyrażeniem, które pojawia się czasem w definicji iteratora. <tt>yield</tt> przenosi sterowanie do bloku kodu który został przekazany do iteratora (wyjaśnimy to dogłębniej w [[Ruby/ProceduryObiekty jako obiektyprocedurowe|rozdziale]] poświęconym obiektom - proceduromprocedurowym). Następujący przykład definiuje iterator <tt>repeat</tt>, który powtarza blok kodu określoną ilość razy przekazaną jako argument.
 
<pre>
Linia 129:
</pre>
 
Czy już rozumiesz czym jest iterator? Owszem, istnieją pewne ograniczenia, ale możesz pisać własne oryginalne iteratory;. i rzeczywiścieSzczególnie, kiedy tylkogdy definiujesz nowy typ danych, wygodnie jest zdefiniować odpowiednie iteratory które będą na nim operować. W tym sensie, powyższe przykłady nie są szczególnie użyteczne. O bardziej praktycznych iteratorach będziemy mogli powiedzieć, kiedy już lepiej zrozumiemy czym są klasy.
<noinclude>
{{ProstaNawigacja|spis=Ruby|poprzart=Ruby/Struktury sterujące|poprz=Struktury sterujące|nastart=Ruby/Myślenie zorientowane obiektowo|nast=Myślenie zorientowane obiektowo}}