Mischen wir es

Wir haben uns verschiedene Objekte angesehen (Zahlen und Buchstaben) und wir haben Variablen auf sie zeigen lassen; als nächstes wollen wir sie nett miteinander kombinieren.

Wir haben gesehen, dass das folgende nicht funktioniert, wenn wir 25 drucken wollen, weil man keine Zahlen und Buchstaben addieren kann:

var1 = 2
var2 = '5'
puts var1 + var2

Teil des Problems ist, dass dein Computer nicht weiß, ob du versuchst, 7 zu bekommen (2+5), oder ob du 25 bekommen wolltest ('2'+'5').

Bevor wir all diese Variablen addieren können, müssen wir wissen, wie wir entweder aus var1 einen String machen können, oder aus var2 eine Integer-Variable.

Umwandlungen

Um ein Objekt in einen String zu verwandeln, müssen wir einfach .to_s dahinter schreiben:

var1 = 2
var2 = '5'
puts var1.to_s + var2
25

Entsprechend gibt uns to_i die Integer-Version eines Objektes, to_f ergibt die Float-Version. Schauen wir uns etwas genauer an, was diese drei Methoden machen (und was sie nicht machen):

var1 = 2
var2 = '5'
puts var1.to_s + var2
puts var1 + var2.to_i
25
7

Beachte, dass obwohl wir die String-Version von var1 ausgeben, var1 immer auf 2 zeigt, und nie auf '2'. Außer wenn wir var1 explizit ein neues Objekt zuweisen (wofür das = Zeichen verwendet wird), zeigt die Variable für die Laufzeit des Programms immer auf 2.

Nun probieren wir ein paar interessantere (und ein paar komische) Umwandlungen:

puts '15'.to_f
puts '99.999'.to_f
puts '99.999'.to_i
puts ''
puts '5 ist meine Lieblingszahl!'.to_i
puts 'Wer fragt nach 5?'.to_i
puts 'Es war deine Mutter.'.to_f
puts ''
puts 'stringy'.to_s
puts 3.to_i
15.0
99.999
99
5
0
0.0

stringy
3

Dies hat wahrscheinlich etwas überrascht. Das erste ist völlig klar: 15.0. Danach haben wir den String '99.999' in ein Float verwandelt und in einen Integer. Das Float hat getan, was wir erwarteten, das Integer verhielt sich wie immer, abgerundet.

Als nächstes hatten wir ein paar Beispiele eigenartiger Strings, die in Integer umgewandelt wurden. to_i ignoriert das erste Zeichen, das es nicht versteht und von da an den Rest des Strings. Entsprechend wurde der erste in 5 umgewandelt, doch die anderen wurden völlig ignoriert, weil sie mit Buchstaben begannen... also wählt der Computer die Null.

Schließlich haben wir noch zwei Umwandlungen, die nichts bewirkten, was wir erwartet hatten.

Nochmal puts

Da gibt's noch etwas eigenartiges an meiner Lieblingsmethode... schau mal hier:

puts 20
puts 20.to_s
puts '20'
20
20
20

Warum drucken alle drei Zeilen dasselbe aus? Bei den beiden letzten ist es klar, da '20' dasselbe ist wie 20.to_s. Aber was ist mit der ersten, die Integerzahl 20? Was bedeutet es denn, die Zahl 20 zu schreiben? Wenn du eine 2 und eine 0 auf ein Stück Papier schreibst, schreibst du einen String, keine Zahl. Der Integer 20 ist die Anzahl an Fingern und Zehen, es ist keine 2 gefolgt von einer 0.

Hier liegt das große Geheimnis hinter unserem Freund puts: bevor puts etwas ausgibt, verwendet es to_s, um eine String-Version des Objektes zu erhalten. Tatsächlich steht das s in puts auch für String: puts bedeutet put String (dt.: gib String).

Das mag jetzt noch nicht zu aufregend wirken, doch in Ruby gibt es viele viele verschiedene Objekte (du wirst sogar noch deine eigenen schreiben!) und es ist wirklich wichtig zu wissen, was passiert, wenn du puts auf irgendein komisches Objekt anwendest, wie vielleicht das Bild Deiner Großmutter oder eine Musikdatei oder so. Aber das kommt später...

In der Zwischenzeit schauen wir uns ein paar weitere Methoden an und schreiben lustige Programme...

Die Methoden gets und chomp

Da puts put String heißt, kannst Du sicher erraten, was gets bedeutet. Und ebenso, wie puts nur Strings ausspuckt, nimmt gets nur Strings an. Und woher bekommt es sie?

Von dir! ... zumindest von deiner Tastatur. Weil deine Tastatur Strings erzeugt, funktioniert das wunderbar. Genau genommen sitzt gets da und wartet darauf, dass du die Enter-Taste drückst. Versuchen wir es:

puts gets

hallo Echo!
hallo Echo!

Natürlich wird genau das, was du tippst (diese Schrift!), wiederholt werden. Starte dieses Programm ein paar Mal und probiere verschiedene Texte aus. Jetzt können wir interaktive Programme schreiben! In diesem hier gibst du deinen Namen ein und es wird dich begrüßen:

puts 'Hallo, wie heißt Du?'
name = gets
puts 'Du heißt '+name+'? Was für ein schöner Name!'
puts 'Schön, dich zu treffen, ' +name+ '. :-)'
Hallo, wie heißt Du?

Chris 
Du heißt Chris
? Was für ein schöner Name!
Schön, dich zu treffen, Chris
. :-)

Hmmm... offensichtlich wurden bei meiner Eingabe der Buchstaben C, h, r, i, s und der Enter-Taste sowohl die Buchstaben, wie auch das Enter in die Variable übernommen. Glücklicherweise gibt es hierfür die Methode chomp. Sie entfernt alle Enter-Zeichen am Ende des Strings. Schreiben wir das Programm ein wenig um und verwenden wir chomp:

puts 'Hallo, wie heißt Du?'
name = gets.chomp
puts 'Du heißt '+name+'? Was für ein schöner Name!'
puts 'Schön, dich zu treffen, ' +name+ '. :-)'
Hallo, wie heißt Du?

Chris 
Du heißt Chris? Was für ein schöner Name!
Schön, dich zu treffen, Chris. :-)

Viel besser! Beachte, dass die Variable name auf gets.chomp zeigt. Deshalb müssen wir chomp nicht wiederholen, name ist bereits ge-chomp-t.

Selber ausprobieren

  • Schreibe ein Programm, das eine Person nach dem ersten und zweiten Vornamen und dem Nachnamen fragt. Danach soll es diese Person grüßen, mit dem vollen Namen.
  • Schreib ein Programm, das eine Person nach ihrer Lieblingszahl fragt, dann 1 dazu zählt und das Ergebnis als größere und bessere Lieblingszahl vorschlägt. (Aber taktvoll!)

Wenn du diese beiden Programme beendet hast, ebenso wie weitere, die du schreiben möchtest, lass uns mehr Methoden kennenlernen, und mehr über Methoden.