Fünf Hallo-Welt-Begrüßungstexte mit Ruby

Das Internet ist voll mit Beispielen dafür, wie man einfache Programme mit geringem praktischen Nutzen schreibt. Die bekanntesten dieser Programme sind:

  • eine Anwendung zur Berechung von Fibonacci-Zahlen, weil sie das Standardbeispiel für Rekursion darstellt.
  • eine Anwendung zur FizzBuzz-Lösung, weil sie die Standardprogrammieraufgabe bei Einstellungsgesprächen darstellt.
  • eine Anwendung zur Verfassung von Hallo Welt-Texten, weil diese das Standardbeispiel zur Erläuterung einer Sprache darstellt.

Um jemandem eine neue Programmiersprache beizubringen, müssen natürlich zahlreiche Kenntnisse zu syntaktischen Formen, semantischem Aufbau und optimierten Verfahren vermittelt werden. All dies wird für den Schüler jedoch meist erst dann verständlich, wenn er oder sie einige Beispiele des entsprechenden Quellcodes sieht. Und genau hier kommt das Hallo-Welt-Programm ins Spiel: Es ist meist das erste Codebeispiel, das einem absoluten Anfänger gezeigt wird, um ihm auf möglichst einfache Weise zu verdeutlichen, wie die Sprache im Praxiseinsatz aussieht. Darauf folgen dann komplexere Beispiele, die häufig das Hallo-Welt-Programm mit aufwendigeren Elementen und zusätzlichen Funktionen erweitern, bis es kaum mehr als Ableger des ursprünglichen Programms zu erkennen ist.

Auch wenn manche die Hallo-Welt-Anwendung als nutzloses Spielzeug betrachten mögen, erfüllt es dennoch einen wichtigen Zweck, den erfahrenere Entwickler vielleicht schon vergessen haben: Mit etwas Kreativität können solche Programme in gewissem Umfang die Flexibilität und einzigartigen Eigenschaften der jeweiligen Sprache demonstrieren. Für alle, die noch nie mit Ruby gearbeitet haben, folgen nun also einige Hallo Welt-Beispiele in der Ruby-Programmiersprache, um genau dies zu erreichen. Jedes Beispiel enthält eine standardmäßige Shebang-Zeile, die dem Betriebssystem mitteilt, wo es den Ruby-Interpreter auf einem Unix-System findet.

1. Das einfache Beispiel

#!/usr/bin/env ruby
puts 'Hallo Welt!'

Hierzu ist nicht viel zu sagen. Es besteht aus ganzen zwei Token: der puts-Methode und einem String-Wert. Ähnliche Sprachen wie Perl und Python würden stattdessen print verwenden. So sieht das gleiche Programm beispielsweise in Perl wie folgt aus:

#!/usr/bin/env perl
print "Hallo Welt!n";

Die doppelten Anführungszeichen und das Zeilenumbruchzeichen n sind notwendig, damit am Ende des Programmoutputs eine neue Zeile folgt. Ruby verfügt über eine print-Methode, die sich ebenso verhält, bietet aber auch puts, das praktischerweise das Zeilenumbruchzeichen automatisch einfügt.

2. Das Eingabebeispiel

#!/usr/bin/env ruby
puts "Hallo #{ARGV[0]}!"

In diesem Fall werden doppelte Anführungszeichen für einen interpolierten String benutzt, also einen String, der für ausführbaren Code sowie für Sonderzeichen, die der Ruby-Interpreter nicht wörtlich auslegen soll, geparst wird. Code, der evaluiert werden soll, bevor der String mit den doppelten Anführungszeichen an die puts-Methode übergeben wird, kann in #{ } verpackt werden. In diesem Fall soll das ARGV-Array – in dem Ruby Eingaben aus der Befehlszeile ablegt – sein erstes Element ausgeben. Da Ruby die Array-Elemente ab null zählt, muss ARGV[0] evaluiert werden.

Wenn man dieses Programm hallo.rb nennt und dann bei Ausführung des Programms Welt als Befehlszeilenargument eingibt, lautet der Output Hallo Welt!:

> ./hallo.rb Welt
Hallo Welt!

3. Das Array-Beispiel

#!/usr/bin/env ruby

greeting = ['Hallo' ARGV[0]]
puts greeting.join(', ') + '!'

Hier gilt es, zunächst ein Array aus zwei Elementen zu erstellen, wobei das zweite den Wert des ersten Elements des ARGV-Arrays erhält, so dass der Benutzer, wie im vorangehenden Beispiel, die Zielgruppe einer Begrüßung festlegen kann. Dann wird die join-Methode an das Array-Objekt greeting übergeben, mit der Anweisung, deren Elemente mit einem Komma, gefolgt von einem Leerzeichen zwischen zwei Elementen, zu verbinden. Schließlich wird ein Ausrufezeichen am Ende des Strings hinzugefügt (in diesem Fall verkettet), bevor dann die puts-Methode eine neue Zeile an das Ende setzt und den gesamten String zum Standard-Output sendet.

Wird dieses Programm zum Beispiel an einem Montag ausgeführt, zu Beginn einer langen und frustrierenden Arbeitswoche, könnte man versucht sein, die Welt etwas weniger freundlich zu begrüßen:

> ./hallo.rb 'grausame Welt'
Hallo grausame Welt!

Diese Version geht zwar einen unnötig komplexen Weg, um genau dasselbe Ergebnis wie das vorangehende Beispiel zu erzielen, aber anhand dieser aufwendigeren Vorgehensweise lassen sich ein paar Dinge verdeutlichen:

  • Man lernt einige der praktischen Textverarbeitungsfunktionen von Ruby kennen, darunter zwei Möglichkeiten zur Verknüpfung separater Strings zu einem größeren String.
  • Daran lässt sich bereits die objektorientierte Konzeption von Ruby erkennen.

Wer die Unterschiede zwischen objektorientierter Programmierung und der Arbeit mit anderen Sprachen kennt, wird vielleicht verschiedene Passagen des bislang gezeigten Codes ansehen und sich fragen, warum die Funktionsweise von Ruby so prozedural wirkt, wenn es sich doch angeblich um eine objektorientierte Sprache handelt. Vor diesem Beispiel war noch nicht klar geworden, dass Objekte und Methoden den Ruby-Quellcode für eine Hallo Welt-Anwendung bevölkern. So stellt sich heraus, dass puts eine Methode der Kernel-Klasse ist, während es sich bei den Strings um Objektinstanzen der String-Klasse handelt. Array-Objekte werden durch eine join-Methode eingebunden, und obwohl es wie ein prozeduraler Infix-Operator wirkt, fungiert + hier in Wirklichkeit als Methode eines String-Objekts. Tatsächlich kann man die letzte Zeile dieser Version des Hallo Welt-Programms wie folgt schreiben, so dass diese Methoden deutlicher als solche erkennbar werden:

Kernel.puts( greeting.join(', ').+('!') )

Nur gut, dass es die verschönernde Syntax gibt: Die Version, die nicht so viele Klammern verwendet und die Kernel-Klasse nicht explizit benennt sowie mit weniger dot-Notationen für die Methoden auskommt, ist angenehmer anzusehen.

4. Das Beispiel mit der spezifischen Methode

#!/usr/bin/env ruby
def greet(target)
return "Hallo #{target}!"
end
puts greet(ARGV[0])

Durch Hinzufügen von noch mehr unnötig komplexen Elementen wurde diesmal der String-Bildungsprozess vom Output-Prozess getrennt, indem eine Methode namens greet erstellt wurde. Durch das Erstellen der greet-Methode ohne ihre ausdrückliche Zuordnung zu einer Klassendefinition wurde diese zur Kernel-Klasse hinzugefügt. Genau wie bei puts muss die Klasse nicht angegeben werden, zu der die Methode gehört. In der Tat kann greet als eine eigene Methode von Kernel nicht wie folgt benannt werden:

Kernel.puts Kernel.greet(ARGV[0])

Dies wäre zwar in irb (dem interaktiven Ruby-Interpreter) möglich, aber mit standardmäßigen ausführbaren Dateien funktioniert dies nicht.

Auch beim Erstellen einer Methode könnte man leicht meinen, dass dabei ein anderes Programmierungsparadigma als die objektorientierte Programmierung zum Einsatz kommt. In diesem Fall sieht es nach funktionaler Programmierung aus, wobei eine „Funktion“ definiert wurde, die exakt einen Input annimmt und exakt einen Output produziert, ohne weitere Effekte zu haben. Diese „Funktion“ wird dann benutzt, um ihren Output als Input für eine andere „Funktion“ bereitzustellen, und zwar die puts-Methode. Nur im Wissen, dass beide dieser vorgeblichen Funktionen in Wirklichkeit Methoden der Kernel-Klasse darstellen, kann man erkennen, dass es sich hierbei um einen rein objektorientierten Vorgang handelt.

Wenn man Code mit funktionalem Erscheinungsbild entwickeln möchte, kann man auch einfach die Abläufe im Hintergrund ignorieren und den Code so schreiben, dass er rein funktional und überhaupt nicht objektorientiert wirkt.

5. Das Beispiel mit der spezifischen Klasse

#!/usr/bin/env ruby
 
class Greeter
def initialize(greeting)
@greeting = greeting
end
 
def greet(subject)
puts "#{@greeting}, #{subject}!"
end
end
 
welcome = Greeter.new('Willkommen')
welcome.greet(ARGV[0])
 
farewell = Greeter.new('Adieu')
farewell.greet(ARGV[1])

Nun geht es endlich etwas mehr ans Eingemachte der objektorientierten Programmierung. Es wird eine Greeter-Klasse definiert und ihre initialize-Methode (die automatisch als Alias für new fungiert) verwendet ein Argument für die Art von Begrüßung, die eine Instanz dieser Klasse benutzen soll. Eine weitere Methode, greet, verwendet ebenfalls ein einzelnes Argument, also das Subjekt oder Ziel der Begrüßung.

Zwei separate Objekte dieser Klasse werden mit der neuen Methode instantiiert, wobei beide bei ihrer Erstellung einem separaten Label zugewiesen werden: welcome und farewell. Jedes Objekt erhält dann die greet-Message mit jeweils dem ersten bzw. zweiten Element des ARGV-Arrays, so dass der Benutzer, der das Programm über die Befehlszeile ausführt, angeben kann, wer die jeweilige Begrüßung erhalten soll.

Wenn zum Beispiel der Benutzer des Programms gut gelaunt ist, weil es Freitag ist und ein langes Wochenende bevorsteht, wird er sicher gerne zu der Begrüßung einen netten und positiven Zusatz hinzufügen. Am Ende des Tages hat dieser Benutzer dann aber vielleicht erfahren, dass seine gesamte Abteilung entlassen wird. Womöglich hat er sich gerade erst ein teures Haus gekauft, das er nun nicht mehr abzahlen kann, und die Aussichten auf einen neuen Job sind auch düster. Daher dürfte er für seinen Abschiedsgruß eine sehr pessimistische Formulierung wählen.

Somit sieht dann die Programmausführung an diesem Tag wie folgt aus:

> ./hallo.rb 'schöne Welt' 'grausame Welt'
Willkommen schöne Welt!
Adieu grausame Welt!

Wer sich mit Ruby gut auskennt, wird hoffentlich nie das Problem haben, plötzlich entlassen zu werden. Diese kurze Ruby-Einführung konnte sicherlich einen ersten Eindruck von der Klarheit und Flexibilität dieser Sprache vermitteln.

ZDNet.de Redaktion

Recent Posts

Taugen Kryptowährungen als Unterstützer der Energiewende?

Bankhaus Metzler und Telekom-Tochter MMS testen, inwieweit Bitcoin-Miner das deutsche Stromnetz stabilisieren könnten.

13 Stunden ago

Supercomputer-Ranking: El Capitan überholt Frontier und Aurora

Mit 1,7 Exaflops ist El Capitan nun der dritte Exascale-Supercomputer weltweit. Deutschland stellt erneut den…

17 Stunden ago

Ionos führt neue AMD-Prozessoren ein

Der deutsche Hyperscaler erweitert sein Server-Portfolio um vier Angebote mit den neuen AMD EPYC 4004…

18 Stunden ago

Lags beim Online-Gaming? DSL-Vergleich und andere Tipps schaffen Abhilfe

Beim Online-Gaming kommt es nicht nur auf das eigene Können an. Auch die technischen Voraussetzungen…

18 Stunden ago

GenKI-Fortbildung immer noch Mangelware

Fast jedes zweite Unternehmen bietet keinerlei Schulungen an. In den übrigen Betrieben profitieren oft nur…

18 Stunden ago

Netzwerk-Portfolio für das KI-Zeitalter

Huawei stellt auf der Connect Europe 2024 in Paris mit Xinghe Intelligent Network eine erweiterte…

20 Stunden ago