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 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"
endAusgabe
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 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 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 bedingungcase/whenvergleicht mit===(Bereiche, Klassen, Regex, Lambdas)times,upto,each,while,until,loopmitbreakundnext- Fast alles liefert einen Wert, auch
ifundcase
Aufgabe
Schreibe FizzBuzz für 1 bis 30 mit case und each.