Ruby/Struktury sterujące: 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 28:
<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>.
 
<source lang="ruby">
<pre>
def okresl(s)
ruby> case 'abcdef'
case s
| when 'aaa', 'bbb'
| puts "aaa lub bbb"
| when /def/
| puts "zawiera /def/"
| end
end
includes /def/
 
nil
okresl("abcdef") #=> zawiera /def/
</pre>
</source>
 
=== while ===
Linia 46 ⟶ 48:
 
<pre>
rubyirb(main):001:0> i = 0
=> 0
rubyirb(main):002:0> puts "To jest zero." if i == 0
To jest zero.
=> nil
rubyirb(main):003:0> puts "To jest liczba ujemna." if i < 0
=> nil
rubyirb(main):004:0> puts i += 1 while i < 3
1
2
3
=> nil
</pre>
 
Linia 64 ⟶ 66:
Są cztery sposoby do przerywania wykonywania 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 (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>:
 
<source lang="cpp">
<pre>
while (warunek) {
etykieta_redo:
Linia 76 ⟶ 78:
etykieta_break:
...
</presource>
 
Czwarty sposób by wyjść z pętli będąc w jej wnętrzu to <tt>return</tt>. Obliczenie instrukcji <tt>return</tt> 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 84 ⟶ 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:
 
<source lang="ruby">
<pre>
for elemelement in kolekcja
# ... tutaj elem"element" wskazuje na element w kolekcji
end
</presource>
 
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>):
 
<source lang="ruby">
<pre>
ruby> for num in (4..6)
| putsprint num
| end
#=> 456
4
</source>
5
6
4..6
</pre>
 
W tym przykładzie przeiterujemy kilka elementów tablicy:
 
<source lang="ruby">
<pre>
ruby> for elem in [100, -9.6, "zalewa"]
| puts "#{elem}\t(#{elem.class})"
| end
#=>
100 (Fixnum)
-9.6 # 100 (FloatFixnum)
# -9.6 (Float)
# zalewa (String)
[100, -9.6, "zalewa"]
</presource>
 
Ale totak jak gonienie własnego ogona.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:
 
Jeżeli przywykłeś do C lub Javy, możesz preferować tą.
 
<source lang="ruby">
<pre>
for element in kolekcja
...
end
</presource>
 
Natomiast programista Smalltalka może preferować taką.
 
<source lang="ruby">
<pre>
kolekcja.each {|element|
...
}
</presource>
 
Iteratory często mogą być używane zamiast konwencjonalnych pętli. Jak już nabierzesz wprawy w ich użyciu, stają się zazwyczaj łatwiejsze w od pętli. Zatem ruszmy się dalej i dowiedzmy się o nich czegoś więcej.