Pętle

W poprzednim rozdziale poznaliśmy wyrażenia warunkowe. Czas dopełnić je pętlami i zacząć pisać naprawdę zaawansowane programy ;)

While

Podstawową pętlą w Rubym (i większości języków programowania) jest while. Składnia (słowo kluczowe do może być zamienione na backslash, średnik lub znak nowej linii):

while WARUNEK do
  INSTRUKCJE
end

Powyższy schemat kodu działa następująco: Jeśli spełniony jest WARUNEK, wykonywane są INSTRUKCJE, po czym jeśli spełniony jest WARUNEK, wykonywane są INSTRUKCJE, po czym… i tak w pętli ;). Poniżej pętla wypisująca 10 pierwszych liczb naturalnych:

#File: Loop.rb
i = 0
while i<10 do
  print "#{i}  "
  i = i+1 #Shorter syntax: i+=1
end
jan@Stacja-Linux ~/Pulpit $ ruby Loop.rb 
0  1  2  3  4  5  6  7  8  9  

Modyfikatory

Ruby posiada modyfikatory, które służą do zmiany składni (oraz działania) pewnych konstrukcji. Pętla while posiada taki modyfikator. Sprawia on, że zamiast sprawdzać warunek i wykonywać kod, pętla wykonuje kod, po czym sprawdza warunek ;). Modyfikator zapewnia, wykonanie się kodu wewnątrz pętli przynajmniej raz. Składnia:

begin
  INSTRUKCJE
end while WARUNEK

Przykład:

#File: Loop2.rb
i = 0
begin
  print "#{i}  "
  i += 1
end while  i<10
jan@Stacja-Linux ~/Pulpit $ ruby Loop2.rb 
0  1  2  3  4  5  6  7  8  9  

Wyrażenie warunkowe if również posiada modyfikator. Nie zmienia on jednak działania tej konstrukcji. Składnia:

INSTRUKCJE if WARUNEK

Przykład:

irb(main):001:0> puts "Hi" if 3>2 
Hi
=> nil
irb(main):002:0> puts "Hey" if 3>4 
=> nil
irb(main):003:0> 

For

Kolejną pętlą w Rubym (i nie tylko) jest for. Wykonuje ona pewne instrukcje dla każdej zmiennej z pewnego zbioru (wyrażenia). Składnia:

for NAZWA_ZMIENNEJ in WYRAŻENIE do
  INSTRUKCJE
end

Przykład:

#File: Loop3.rb
for i in 0...10 do
  print "#{i}  "
end
jan@Stacja-Linux ~/Pulpit $ ruby Loop3.rb 
0  1  2  3  4  5  6  7  8  9  

Pojawiła się pewna nowość - zakres. Zakresy to specjalne konstrukcje, które po kolei “podają” liczby z pewnego… zakresu ;) x...y oznacza liczby od x do y, natomiast x..y oznacza liczby od x do y włącznie.

Do pętli for wrócimy w następnym rozdziale. Teraz zajmiemy się dwoma ciekawymi słowami kluczowymi: break i next.

Break

Słowo kluczowe break służy do przerywania pętli. Poniżej kolejna wariacja programu sprawdzającego podzielność liczby przez 13:

 

#File: Loop4.rb
i = 0
while i<5 
  puts "Type a number (or \"exit\" if you want to quit) and press ENTER"
  input = gets
  break if input == "exit\n"
  n = input.to_f
  puts "#{n} is #{n%13==0 ? "" : " NOT" } divisible by 13"
  i+=1
end
puts "Thanks for using our software! If you want to check more than five numbers in one run, please download full version!"

Powyższy program sprawdza w pętli, czy dana liczba jest podzielna przez 13. Robi to jednak tylko 5 razy, po czym wyświetla stosowny komunikat ;) Co więcej, jeśli użytkownik wpisze “exit” program zakończy działanie dzięki słowu kluczowemu break. Zauważ, że metoda gets dodaje na końcu podanego tekstu znak nowej linii (stąd “\n” przy sprawdzaniu wartości zmiennej input). Może spróbujesz napisać pełną wersję programu? ;)

Next

Słowo kluczowe next umożliwia pominięcie jednego “obrotu pętli” (mówiąc inaczej: jednej iteracji). Poniżej wykorzystanie tego mechanizmu w uniknięciu błędu spowodowanego próbą dzielenia przez zero:

#File: Loop5.rb
for x in -5..5 
  next if x == 0
  puts "300/#{x} = #{300/x}"
end
jan@Stacja-Linux ~/Pulpit $ ruby Loop5.rb 
300/-5 = -60
300/-4 = -75
300/-3 = -100
300/-2 = -150
300/-1 = -300
300/1 = 300
300/2 = 150
300/3 = 100
300/4 = 75
300/5 = 60

Jeśli nie należysz do strachliwych usuń/zakomentuj drugą linię programu i zobacz co się wydarzy ;)

 

Dla ciekawych świata:
Więcej informacji o pętlach (między innymi pętle until oraz each, dla których zabrakło miejsca w samouczku ;)).
Zakresy w Rubym.