EMZETT.
Login

Kurz: puts “bestanden” if punkte >= 50 # Modifikator-Form puts “nicht ganz” unless punkte >= 80 # unless = if not ergebnis = punkte >= 50 ? “ja” .

Teil des Kurses Ruby

Kapitel 3 von 12 im Kurs Ruby. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

if, unless, case

punkte = 78
if punkte >= 90
  puts "sehr gut"
elsif punkte >= 75
  puts "gut"
else
  puts "weiter üben"
end
 
puts "bestanden" if punkte >= 50          # Modifikator-Form
puts "nicht ganz" unless punkte >= 80      # unless = if not
ergebnis = punkte >= 50 ? "ja" : "nein"    # ternär
puts ergebnis
status = if punkte > 70 then "stark" else "schwach" end    # if ist ein Ausdruck
puts status

Ausgabe:

gut
bestanden
nicht ganz
ja
stark

case ist ein mächtiger Mustervergleich (nutzt ===):

def beschreibe(x)
  case x
  when 0 then "null"
  when 1..9 then "einstellig"
  when Integer then "große Ganzzahl"
  when /^\d+$/ then "Zahl als Text"
  when String, Symbol then "Text"
  when nil then "nichts"
  when ->(v) { v.respond_to?(:each) } then "Sammlung"
  else "unbekannt"
  end
end
 
[0, 5, 99, "123", "abc", :s, nil, [1], 2.5].each { |v| puts "#{v.inspect}: #{beschreibe(v)}" }
 
note = 87
puts case
     when note >= 90 then "A"
     when note >= 80 then "B"
     else "C"
     end

Ausgabe:

0: null
5: einstellig
99: große Ganzzahl
"123": Zahl als Text
"abc": Text
:s: Text
nil: nichts
[1]: Sammlung
2.5: einstellig
B

Schleifen

3.times { |i| print i, " " }
puts
1.upto(4) { |i| print i, " " }
puts
10.downto(7) { |i| print i, " " }
puts
1.step(10, 3) { |i| print i, " " }
puts
 
for farbe in %w[rot grün blau]
  print farbe, " "
end
puts
 
n = 3
while n > 0
  print n, " "
  n -= 1
end
puts
i = 0
until i >= 3
  print i, " "
  i += 1
end
puts
 
(1..10).each do |z|
  next if z.odd?       # überspringen
  break if z > 6       # abbrechen
  print z, " "
end
puts
 
loop do
  i += 1
  break if i > 5
end
puts i

Ausgabe:

0 1 2
1 2 3 4
10 9 8 7
1 4 7 10
rot grün blau
3 2 1
0 1 2
2 4 6
6

Idiomatisch nutzt Ruby Iteratoren mit Blöcken statt for: each, times, map, select. Blöcke stehen in { |x| ... } (eine Zeile) oder do |x| ... end (mehrere Zeilen).

Schleifen-Ergebnis und redo

ergebnis = [1, 2, 3, 4].each_with_index.map { |x, i| x * i }
p ergebnis
p (1..3).each_with_object([]) { |x, acc| acc << x * x }
r = [5, 8, 12].each do |x|
  break x if x > 6        # break mit Wert
end
p r
p (1..Float::INFINITY).lazy.select(&:even?).map { |x| x * x }.first(4)

Ausgabe:

[0, 2, 6, 12]
[1, 4, 9]
8
[4, 16, 36, 64]

Merke

  • if/elsif/else, unless, Modifikator ... if bedingung
  • case/when vergleicht mit === (Bereiche, Klassen, Regex, Lambdas)
  • times, upto, each, while, until, loop mit break und next
  • Fast alles liefert einen Wert, auch if und case

Übungsaufgabe

Schreibe FizzBuzz für 1 bis 30 mit case und each.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Variablen, Zahlen und Strings

Weiter: Arrays, Hashes und Bereiche

Alle Kapitel: Ruby im Überblick