Newsletter

Grupa MagazynyInternetowe

Online: 920

Wyszukiwarka

Ruby, Ruby on Rails, Programowanie

Programowanie w Ruby

Warunki i pętle

Instrukcje warunkowe

W Ruby znajdziemy trzy podstawowe instrukcje warunkowe: if, unless oraz switch. Najprostszy if (jeżeli) dla zadanego warunku wykonuje określony blok kodu:

[+]
 
 
Pobierz
1. a = 5
2. -> 5
3. if a > 0
4. a = 10
5. end
6. -> 10

Blok warunkowy lub pętla musi zostać zakończona słowem kluczowym end. Wykonanie złożonej z dwóch porównań instrukcji warunkowej prezentuje się następująco:

[+]
 
 
Pobierz
1. if a != 0 && b == 0
2. a = 10
3. elsif a == 0
4. a = 5
5. else
6. a = 7
7. end

Operatory logiczne używane przez Ruby są zgodne ze znanymi z innych języków programowania. Jeżeli warunek stojący przy IF jest nieprawdziwy, wykonywane są instrukcje elsif wyrażenia. Jeżeli żadny warunek nie zostanie spełniony, wówczas wykonywany jest fragment kodu else.

Ciekawą konstrukcją warunkową jest unless (ang. dopóki). Zatem dopóki wyrażenie -> to:

[+]
 
 
Pobierz
1. unless cena > 100
2. przesylka = 20
3. end

W Ruby nie zabrakło operatora trójargumentowego, uwielbianego przez programistów:

[+]
 
 
Pobierz
cena > 100 ? przesylka = 0 : przesylka = 20

Jego konstrukcja jest identyczna jak w C/C++/PHP: warunek ? co_gdy_prawda : co_gdy_fałsz.

Ruby nie narzuca sposobu praktycznego użycia funkcji warunkowych. Oto nieco szokujący przykład:

 
 
 
Pobierz
print "tak" if a > 0

Funkcji warunkowych możemy więc używać także wewnątrz funkcji, z odwróconą kolejnością - najpierw instrukcja, a dopiero potem warunek.

Switch czy też zwrotnica to konstrukcja przeznaczona do obsługi wielu możliwych przypadków:

[+]
 
 
Pobierz
1. cenaPrzesylki = case Total
2. when 0..200: 20
3. when 201..300: 16
4. when 301..500: 6
5. else 0
6. end

W przykładzie zmienna cenaPrzesylki przyjmuje wartość zależną od zmiennej Total. Wyobraźmy sobie zatem sklep internetowy. Cena przesyłki zależy od wartości zamówienia. I tak zamówienia np. od 0-200 zł wiążą się z kosztem przesyłki 20 zł, itd.

Pętle

Wyróżniamy trzy dostępne w ruby pętle: while, do i for, choć sposobów wykonania iteracji jest więcej.

Pętla while wykonuje obrót zawsze, gdy spełniony jest warunek:

[+]
 
 
Pobierz
1. while warunek
2. print zmienna
3. end

Pętli while używamy, gdy nie znamy rozmiaru wczytywanego pliku. Przykład odczytu zawartości linia po linii opiera się o klasę File (do zarządzania plikami) oraz metody open (otwórz plik), gets (pobierz linię):

[+]
 
 
Pobierz
1. file=File.open("plik")
2. while line = file.gets
3. print line
4. end

Konstrukcja "do" jest bardzo ciekawym wynalazkiem takie spostrzeżenia mają programiści innych języków:

[+]
 
 
Pobierz
1. 3.times do print "he " end
2. -> he he he

W ruby wszystko zdaje się proste. Zamiast zastanawiać się, ile razy pętla obróci, piszemy, by obróciła się 3.razy (3.times) i to tyle. Wyświetlenie napisu „he” nastąpi trzykrotnie. Bardziej rozbudowana instrukcja „do” może iterować od pewnej wartości w górę (upto) lub w dół (down to). Aby pętla obróciła od 10 do 0 co jeden, korzystamy z konstrukcji:

[+]
 
 
Pobierz
1. 10.downto(0) do |x| print x, " " end
2. -> 10 9 8 7 6 5 4 3 2 1 0

Często zachodzi potrzeba interacji po tablicy. Stwórzmy jedną i skorzystajmy z metody each wykonanej na obiekcie tablica:

[+]
 
 
Pobierz
1. tablica = [0,4,3,1,2,5]
2. tablica.each { |x| print x, " " }
3. -> 0 4 3 1 2 5

Dziwna konstrukcja |x|, która się powtarza od ostatnich dwóch przykładów, to zmienna, której wartość ustalana jest dynamicznie w danym bloku przez interpreter. W powyższym przykładzie x jest wartością dla kolejnych indeksów tablicy. Użycie konstrukcji zaopatrzonej w klamry jest konieczne, gdyż wszystkie bezpośrednie operacje iteracyjne na metodach w Ruby formułowane są właśnie w taki sposób.

Typowa pętla „for” opiera się o konstrukcję for zmienna in obiekt:

[+]
 
 
Pobierz
1. for x in tablica
2. print x*x, " "
3. end
4. -> 0 16 9 1 4 25

Korzystając z tablicy z poprzedniego przykładu, interujemy po wszystkich jej wartościach, wyświetlając ich potęgę (moglibyśmy użyć też x**2, ale x*x jest szybsze). Jeżeli potrzebujemy iterować od 1 do 10, wystarczy wprowadzić zakres:

[+]
 
 
Pobierz
1. for x in 1..10
2. print x, " "
3. end
4. -> 1 2 3 4 5 6 7 8 9 10

Po literach też można iterować, a czemu by nie:

[+]
 
 
Pobierz
1. for x in "a".."d"
2. print x, " "
3. end
4. -> a b c d

We wszystkich pętlach możemy używać rozmaitych struktur kontrolnych. W Ruby wyróżniamy: next (przejdź do kolejnego obrotu pętli), redo (wykonaj interację jeszcze raz przy tym samym warunku, bez jego przeliczania), break (przerwij pętlę), retry (przewija pętle do samego początku, wracając do wartości początkowych iteracji).

Poniższy przykład jest całkowicie pozbawiony sensu, ma jedynie za zadanie przedstawić sposób implementacji struktur kontrolnych:

[+]
 
 
Pobierz
1. for x in 1..100
2. next if a > 0
3. redo if c == 0
4. break if koniec
5. retry if error > 0
6. end

Powróćmy jeszcze raz do tworzenia tablic. Możemy bardzo szybko stworzyć nową, posiłkując się metodą to_a (to też swojego rodzaju pętla):

[+]
 
 
Pobierz
1. (1..10).to_a
2. -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
3. ("a".."f").to_a
4. -> ["a", "b", "c", "d", "e", "f"]

Bardziej złożone wartości dla dynamicznie generowanej tablicy można otrzymać, wykorzystując klasę Array:

[+]
 
 
Pobierz
1. a = Array.new(10) { |x| x*x*x }
2. -> [0, 1, 8, 27, 64, 125, 216, 343, 512, 729]

W ten sposób udało się utworzyć tablicę, której każdy następny element jest kolejną liczbą całkowitą podniesioną do trzeciej potęgi. Jeżeli mielibyśmy za zadanie usunąć wszystkie elementy tablicy, które są większe od 100, moglibyśmy użyć następującej konstrukcji:

[+]
 
 
Pobierz
1. a.delete_if { |x| x>= 100 }
2. -> [0, 1, 8, 27, 64]
3 lutego 2008

Powiązane publikacje

RailsSpace. Tworzenie społecznościowych serwisów internetowych w Ruby on Rails

RailsSpace. Tworzenie społecznościowych serwisów internetowych w Ruby on Rails

Ruby on Rails dla zaawansowanych - tworzymy system newsów

Ruby on Rails dla zaawansowanych - tworzymy system newsów

Ruby on Rails

Ruby on Rails

 
Skomentuj
ten artykuł

Komentarzy: 1

Kod obrazkowy
(Kliknij, aby zmienić)
 
Przejdż do tego postu na forum niedziela, 10.02.2008 19:06bs

1. b % 2 (gdzie b = 5)
2. -> 0

Czy aby na pewno ? wink.gif

Zobacz wszystkie komentarze »

Autor

Paweł Grzesiak

Artykuły tego autora:

Newsletter

Jesli chcesz być na bieżąco z tym co się dzieje na stronie magazynu INTERNET Maker zapisz się do naszego newslettera.