Wyrażenia warunkowe w Rubim

Posted by Jacek Galanciak on

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.