Wyrażenia warunkowe w Rubim
Posted by Jacek Galanciak on Apr 4 2007
Niemal każdy program musi się wykazać pewną interakcją z użytkownikiem lub systemem, a każdy język programowania ma obowiązek dostarczyć odpowiednią do tego składnię. Zobaczmy, jak to się robi w Rubim.
if
Wyrażenie warunkowe if w Rubim działa tak, jak znamy je z innych języków:
a = gets.to_i
if (1..3).include? a
puts "Brawo!"
puts "Medal dla Ciebie."
elsif a == 4
puts "Najgorsze miejsce w rankingu."
else
puts "Boooooo!"
end
Zwróćmy uwagę na pisownię słowa elsif.
Czasem możemy zechcieć upchnąć blok warunkowy w mniejszej ilości linijek. Pamiętajmy, by użyć wtedy słowa then lub : przed instrukcją, która ma się wykonać po spełnieniu warunku.
if b == 0 then puts "Nie będę dzielić przez zero."
elsif b == 1: c = a
else c = a/b
end
Zwróćmy uwagę na fakt, że po else nie stawiamy ani then, ani :.
unless
Podobnie jak pętla while ma swój negatywny odpowiednik until, tak i if posiada swoje unless: [kod jest abstrakcyjny - nie posiadamy definicji delete_user]
unless user == "admin"
delete_user(user)
else
puts "Admin jest nietykalny."
end
unless nie posiada odpowiednika klauzuli elsif, ale zasady dotyczące skracania kodu aplikują się również dla unless.
Modyfikatory wyrażeń
if i unless posiadają modyfikatory, podobnie jak while i until.
puts a unless a == 0
puts a if (1..9).include? a
case
Konstrukcja ta jest niezwykle potężnym narzędziem i niektórych mogą zaskoczyć jej możliwości.
a = gets.to_i
case a
when 1..2, 3
puts "Medal dla Ciebie!"
puts "Brawo!"
when 4
puts "To najgorsze miejsce."
else
puts "Booooo!"
end
Poza ciekawym przedsmakiem możliwości wyrażeń w Ruby (o których napiszę niebawem), przykład ten nie pokazał niczego specjalnego. Przyjrzyjmy się więc drugiemu.
case
when a == b
puts "Wartości te nie mogą się równać."
when b == 0
puts "b nie może być zerowe."
else
puts "Nie wiem co, ale na pewno coś jest źle."
end
Powyższa konstrukcja sprawdza po kolei każdy z warunków i wykonuje tylko ten, który zostanie spełniony jako pierwszy. Warto zapamiętać, że Ruby umożliwia nam użycie słów then oraz : do takich samych zastosowań, jak w przypadku if i unless.
if, unless, case nie są instrukcjami
Może to brzmieć zaskakująco, ale te trzy wymienione słowa kluczowe to nie instrukcje, a wyrażenia - i jak każde wyrażenie, potrafią zwracać wartość.
a = gets.to_i
word = if a == 1
"jeden"
elsif a == 2
"dwa"
elsif a == 3
"trzy"
else
"nie znam takiej liczby"
end
puts word
Zasada ta aplikuje się również do unless i case.
Trójargumentowe wyrażenie warunkowe
Na koniec niewymagający głębszego komentarza, dość znany przykład z liczeniem silni przy wykorzystaniu trójargumentowego wyrażenia warunkowego:
def factorial(n)
n > 1 ? n*factorial(n - 1) : 1
end
Kluczowym zagadnieniem w wyrażeniach warunkowych jest konstrukcja wyrażeń logicznych w Rubim. Będzie to tematem następnej części tutoriala.