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

Usunięta treść Dodana treść
Nie podano opisu zmian
 
Linia 7:
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, jak za chwilę zobaczymy, znacznie potężniejsza.
 
<sourcesyntaxhighlight lang="ruby">
def okresl(i)
case i
Linia 18:
 
okresl(8) #=> 6..10
</syntaxhighlight>
</source>
 
<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:
 
<sourcesyntaxhighlight lang="ruby">
(2..5) === i
</syntaxhighlight>
</source>
 
<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>.
 
<sourcesyntaxhighlight lang="ruby">
def okresl(s)
case s
Linia 39:
 
okresl("abcdef") #=> zawiera /def/
</syntaxhighlight>
</source>
 
=== while ===
Linia 66:
Są cztery sposoby do przerywania wykonywania pętli z jej wnętrza. Pierwszy, to zastosowanie instrukcji <tt>break</tt>. Powoduje, tak jak w C, zupełną ucieczkę z pętli. Drugi, to zastosowanie instrukcji <tt>next</tt>. Powoduje ona przeskoczenie na początek kolejnej iteracji (podobnie jak znane z C <tt>continue</tt>). Trzeci, to użycie specyficznej dla Rubiego instrukcji <tt>redo</tt>, która powoduje ponowne wykonanie bieżącej iteracji. Następujący kod w języku C ilustruje znaczenie instrukcji <tt>break</tt>, <tt>next</tt> i <tt>redo</tt>:
 
<sourcesyntaxhighlight lang="cpp">
while (warunek) {
etykieta_redo:
Linia 78:
etykieta_break:
...
</syntaxhighlight>
</source>
 
Czwarty sposób by wyjść z pętli będąc w jej wnętrzu to użycie instrukcji <tt>return</tt>. Jej wywołanie spowoduje wyjście nie tylko z pętli ale również z metody, która tę pętlę zawiera. Jeżeli podany został argument, będzie on zwrócony jako rezultat wywołania metody. W przeciwnym wypadku zwracane jest <tt>nil</tt>.
Linia 86:
Programiści C mogą się zastanawiać jak zrobić pętlę "<tt>for</tt>". Petla <tt>for</tt> Rubiego może służyć w ten sam sposób, choć jest nieco bardziej elastyczna. Pętla poniżej iteruje każdy element w kolekcji (tablicy, tablicy asocjacyjnej, sekwencji numerycznej, itd.), ale nie zmusza programisty do myślenia o indeksach:
 
<sourcesyntaxhighlight lang="ruby">
for element in kolekcja
# ... "element" wskazuje na element w kolekcji
end
</syntaxhighlight>
</source>
 
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>):
 
<sourcesyntaxhighlight lang="ruby">
for num in (4..6)
print num
end
#=> 456
</syntaxhighlight>
</source>
 
W tym przykładzie przeiterujemy kilka elementów tablicy:
 
<sourcesyntaxhighlight lang="ruby">
for elem in [100, -9.6, "zalewa"]
puts "#{elem}\t(#{elem.class})"
Linia 110:
# -9.6 (Float)
# zalewa (String)
</syntaxhighlight>
</source>
 
Ale tak naprawdę <tt>for</tt> jest po prostu innym sposobem zapisania instrukcji <tt>each</tt>, która jest naszym pierwszym przykładem iteratora. Poniższe formy są równoważne:
Linia 116:
Jeżeli przywykłeś do C lub Javy, możesz preferować tą.
 
<sourcesyntaxhighlight lang="ruby">
for element in kolekcja
...
end
</syntaxhighlight>
</source>
 
Natomiast programista Smalltalka może preferować taką.
 
<sourcesyntaxhighlight lang="ruby">
kolekcja.each {|element|
...
}
</syntaxhighlight>
</source>
 
Iteratory często mogą być używane zamiast konwencjonalnych pętli. Jak już nabierzesz wprawy w ich użyciu, stają się zazwyczaj łatwiejsze w użyciu od pętli. Ale zanim dowiemy się więcej o iteratorach, poznajmy jedną najciekawszych konstrukcji języka Ruby: domknięcia.