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
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 statusAusgabe:
gut
bestanden
nicht ganz
ja
starkcase 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"
endAusgabe:
0: null
5: einstellig
99: große Ganzzahl
"123": Zahl als Text
"abc": Text
:s: Text
nil: nichts
[1]: Sammlung
2.5: einstellig
BSchleifen
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 iAusgabe:
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
6Idiomatisch 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 bedingungcase/whenvergleicht mit===(Bereiche, Klassen, Regex, Lambdas)times,upto,each,while,until,loopmitbreakundnext- Fast alles liefert einen Wert, auch
ifundcase
Übungsaufgabe
Schreibe FizzBuzz für 1 bis 30 mit case und each.
Quiz zur Selbstkontrolle
Was ist unless?
- Das Gegenteil von if (richtig)
- Eine Schleife
- Ein Kommentar
- Eine Klasse
Wie überspringt man einen Schleifendurchlauf?
- next (richtig)
- continue
- skip
- pass
Womit vergleicht case/when?
- Mit dem Operator === (richtig)
- Mit ==
- Mit equal?
- Mit eql?
Weiter im Kurs
Zurück: Variablen, Zahlen und Strings
Weiter: Arrays, Hashes und Bereiche
Alle Kapitel: Ruby im Überblick