Ruby/Struktury sterujące: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Szymon wro (dyskusja | edycje)
Szymon wro (dyskusja | edycje)
Nie podano opisu zmian
Linia 1:
== Struktury sterujące ==
 
Ten rozdział odkrywa nieco więcej na temat struktur sterujących w Rubim.
 
=== case ===
 
Instrukcji ''<tt>case''</tt> używamy do sprawdzenia sekwencji warunków. Na pierwszy rzut oka jest ona podobna do instrukcji ''<tt>switch''</tt> z języka C lub Java ale znacznie bardziej potężna, jak za chwilę zobaczymy.
 
<pre>
Linia 19:
</pre>
 
''<tt>2..5''</tt> jest wyrażeniem oznaczającym przedział zamknięty od 2 do 5. Następujące wyrażenie sprawdza czy wartość ''<tt>i''</tt> należy do tego przedziału:
 
<pre>
Linia 25:
</pre>
 
''<tt>case''</tt> wewnętrznie używa operatora relacji ''<tt>===''</tt> by sprawdzić kilkanaście warunków za jednym razem. W odniesieniu do obiektowej natury Rubiego, ''<tt>===''</tt> jest interpretowany odpowiednio dla obiektu który pojawia się jako warunek w instrukcji ''<tt>when''</tt>. Na przykład, następujący kod sprawdza równość łańcuchów znakowych w pierwszym wyrażeniu ''<tt>when''</tt> oraz zgodność wyrażeń regularnych w drugim ''<tt>when''</tt>.
 
<pre>
Linia 38:
</pre>
 
=== while ===
 
Ruby dostarcza wygodnych sposobów do tworzenia pętli, chociaż jak odkryjesz w następnym rozdziale, wiedza o tym jak używać iteratorów często zaoszczędzi ci bezpośredniego pisania własnych pętli.
 
''<tt>while''</tt> jest powtarzanym ''<tt>if''</tt>. Używaliśmy tej instrukcji w nasze słownej zgadywance i w programach sprawdzających wyrażenia regularne (zobacz [[Ruby/Powrót do prostych przykładów|poprzedni rozdział]]). Tutaj instrukcja ta przyjmuje formę ''<tt>while'' warunek ... ''end''</tt> otaczającą blok kodu które będzie powtarzany dopóki warunek jest prawdziwy. Ale ''<tt>while''</tt> i ''<tt>if''</tt> mogą być łatwo zaaplikowane do pojedynczych wyrażeń:
 
<pre>
Linia 59:
</pre>
 
Czasami chcesz zanegować sprawdzany warunek. ''<tt>unless''</tt> jest zanegowanym ''<tt>if''</tt> a ''<tt>until''</tt> zanegowanym ''<tt>while''</tt>. Poeksperymentuj jak chcesz z tymi dwoma instrukcjami.
 
Są cztery sposoby do przerwania postępu pętli z jej wnętrza. Pierwszy, ''<tt>break''</tt> oznacza, tak jak w C, zupełną ucieczkę z pętli. Drugi, ''<tt>next''</tt> przeskakuje na początek kolejnej iteracji pętli (podobnie jak znane z C ''<tt>continue''</tt>). Trzeci, to specyficzne dla Rubiego ''<tt>redo''</tt>, które oznacza ponowne wykonanie bieżącej iteracji. Następujący kod w języku C ilustruje znaczenia instrukcji ''<tt>break''</tt>, ''<tt>next''</tt>, i ''<tt>redo''</tt>:
 
<pre>
Linia 77:
</pre>
 
Czwarty sposób by wyjść z pętli będąc w jej wnętrzu to ''<tt>return''</tt>. Obliczenie instrukcji ''<tt>return''</tt> powoduje wyjście nie tylko z pętli ale również z metody która tę pętle zawiera. Jeżeli podany został argument, będzie on zwrócony jako rezultat wywołania metody. W przeciwnym wypadku zwracane jest ''<tt>nil''</tt>.
 
=== for ===
 
Programiści C będą się zastanawiać jak zrobić pętlę "''<tt>for''</tt>". ''<tt>for''</tt> Rubiego może służyć w ten sam sposób, choć jest nieco bardziej elastyczne. Pętla poniżej przebiega raz każdy element w kolekcji (tablicy, tablicy asocjacyjnej, sekwencji numerycznej, itd.), ale nie zmusza programisty do myślenia o indeksach:
 
<pre>
Linia 89:
</pre>
 
Kolekcją może być przedział wartości (to właśnie większość ludzi ma na myśli, gdy mówi o pętli ''<tt>for''</tt>):
 
<pre>
Linia 113:
</pre>
 
Ale prześcigamy samych siebie. ''<tt>for''</tt> jest tak naprawdę innym sposobem zapisania instrukcji ''<tt>each''</tt>, która, jak to bywa, jest naszym pierwszym przykładem iteratora. Poniższe formy są równoważne:
 
Jeżeli przywykłeś do C lub Javy, możesz preferować tą.