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.