Grupa MagazynyInternetowe
Online: 920W Ruby znajdziemy trzy podstawowe instrukcje warunkowe: if, unless oraz switch. Najprostszy if (jeżeli) dla zadanego warunku wykonuje określony blok kodu:
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:
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:
1. unless cena > 100 2. przesylka = 20 3. end
W Ruby nie zabrakło operatora trójargumentowego, uwielbianego przez programistów:
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:
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:
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.
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:
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ę):
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:
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:
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:
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:
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:
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:
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:
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):
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:
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:
1. a.delete_if { |x| x>= 100 } 2. -> [0, 1, 8, 27, 64]
Powiązane publikacje
Komentarzy: 1
Artykuły tego autora:
PHP zdobył przed laty popularność jako język skryptowy do tworzenia stron internetowych. Wzięła się ona z pewnością stąd, że jeszcze kilka lat temu nie było alternatywy dla szybkiego, prostego i dostosowanego do potrzeb WWW języka. Dziś jest inaczej. Prezentujemy języki i technologie, które również powstały z myślą o programowaniu webowym.
Polecamy:
Na skróty:
Magazyny Internetowe| Co za ile| Programy| Praca| Magazyn Internet| Internet Maker| Web Toster| ForumNasze serwisy: