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.