Ruby/Iteratory: 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:
== Iteratory ==
 
Iteratory nie są oryginalnym pojęciem Rubiego. Są one w powszechnym użyciu w językach zorientowanych obiektowo. Występują również w Lispie, choć nie są tam nazywane iteratorami. Jednakże koncepcja iteratorów jest wielu osobom obca, więc tutaj zostanie one wyjaśniona nieco bardziej szczegółowo.
 
Linia 24 ⟶ 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 więcejjedno: często język dostarcza iteratorów dla typów wbudowanych, ale rozczarowuje 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łasne typy danych jeden za drugim, więc to może być całkiem poważnym problemem.
 
Tak więc każdy język wspierający OOP zawiera jakieś udogodnienia do iterowania. Niektóre języki dostarczają w tym celu specjalnych klas; Ruby pozwala na definiowanie iteratorów bezpośrednio.
Linia 50 ⟶ 52:
... jednakże, iterator ''each_byte'' jest koncepcyjnie prostszy, jak i wydaje się, że działałby nadal nawet gdyby klasa ''String'' 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, jest to charakterystyczna cecha dobrego kodu w ogólności. (Tak, miej cierpliwość, niebawem będziemy mówić również o tym czym są klasy.)
 
AnotherInnym iteratoriteratorem ofklasy ''String'' isjest ''each_line''.
 
<pre>
Linia 60 ⟶ 62:
</pre>
 
Zadania które pochłonęły by większość wysiłku w C (wyszukiwanie ograniczników linii, generowanie podłańcuchów, itd.) z użyciem iteratorów mogą być łatwo rozwiązane.
The tasks that would take most of the programming effort in C (finding line delimiters, generating substrings, etc.) are easily tackled using iterators.
 
Instrukcja ''for'' pojawiająca się w [[Ruby/Struktury sterujące|poprzednim rozdziale]] dokonywała iteracji przez użycie iteratora ''each''. Iterator ''each'' klasy String działa w ten sam sposób jak ''each_line'', więc przepiszmy powyższy przykład z ''for'':
The for statement appearing in the previous chapter does iteration by way of an each iterator. String's each works the same as each_line, so let's rewrite the above example with for:
 
<pre>
Linia 74 ⟶ 76:
</pre>
 
Możemy używać struktury sterującej ''retry'' w połączeniu z iterowaną pętlą. Powoduje ona rozpoczęcie iterowania pętli od początku.
We can use a control structure retry in conjunction with an iterated loop, and it will retry the loop from the beginning.
 
<pre>