Stufe 1Einstieg · Lektion 3 von 34
Hello world!
Jede Sprache beginnt mit „Hello world“. In Scala 3 besteht es aus einer einzigen Zeile. An ihr lässt sich gut zeigen, wie ein Programm aufgebaut ist, wie Sie es starten und was der Compiler daraus macht.
Die kürzeste Fassung
Legen Sie eine Datei hallo.scala an und schreiben Sie hinein:
@main def hallo(): Unit = println("Hallo, Welt!")Starten Sie das Programm im selben Ordner:
$ scala run hallo.scala
Hallo, Welt!Beim ersten Aufruf dauert es einige Sekunden, weil der Compiler startet und das Ergebnis zwischenspeichert. Weitere Aufrufe ohne Änderung sind deutlich schneller.
Zeile für Zeile
@mainist eine Annotation. Sie macht die folgende Methode zum Einstiegspunkt des Programms.def hallo()definiert eine Methode namenshalloohne Parameter. Der Name ist frei wählbar; er wird zum Namen des erzeugten Programms.: Unitist der Rückgabetyp.Unitbedeutet „kein sinnvoller Rückgabewert“, vergleichbar mitvoidin Java.=leitet den Rumpf ein. In Scala ist eine Methode ein Ausdruck – bei einer Zeile braucht es keine geschweiften Klammern.printlngibt Text mit Zeilenumbruch auf der Konsole aus.
Mehrere Zeilen und Einrückung
Sobald der Rumpf mehr als eine Zeile hat, rücken Sie ihn ein. Scala 3 erkennt Blöcke an der Einrückung, ähnlich wie Python:
@main def hallo(): Unit =
val name = "Welt"
val gruss = s"Hallo, $name!"
println(gruss)
println(s"Der Gruß hat ${gruss.length} Zeichen.")Das s vor den Anführungszeichen schaltet die String-Interpolation ein: $name setzt den Wert der Variable ein, ${…} einen beliebigen Ausdruck. Mehr dazu in der Lektion über Strings. Geschweifte Klammern sind weiterhin erlaubt; beide Schreibweisen lassen sich sogar mischen. Welche Form üblich ist, beschreibt die Lektion über Konventionen.
Argumente von der Kommandozeile
Parameter der @main-Methode werden automatisch aus den Kommandozeilenargumenten gelesen – samt Umwandlung in den passenden Typ:
@main def gruss(name: String, anzahl: Int): Unit =
for i <- 1 to anzahl do
println(s"$i. Hallo, $name!")$ scala run gruss.scala -- Ada 3
1. Hallo, Ada!
2. Hallo, Ada!
3. Hallo, Ada!Die zwei Striche -- trennen die Optionen des scala-Befehls von den Argumenten Ihres Programms. Übergeben Sie für anzahl keinen Zahlwert, bricht das Programm mit einer verständlichen Fehlermeldung ab – die Umwandlung prüft Scala für Sie.
So sah es in Scala 2 aus
In älteren Anleitungen begegnet Ihnen diese Form:
object Hallo {
def main(args: Array[String]): Unit = {
println("Hallo, Welt!")
}
}Sie funktioniert auch in Scala 3 noch. Ein object ist ein Singleton – eine Klasse mit genau einer Instanz –, und die Methode main mit einem Array[String] ist der klassische Einstiegspunkt der JVM. Die Variante object Hallo extends App { … } war in Scala 2 ebenfalls verbreitet. Sie läuft in Scala 3 zwar noch, wird aber nicht mehr empfohlen, weil der Mechanismus dahinter (DelayedInit) aus der Sprache entfernt wurde.
Was der Compiler erzeugt
Hinter den Kulissen übersetzt der Compiler die Datei in JVM-Bytecode (.class-Dateien) und zusätzlich in .tasty-Dateien. TASTy ist ein Zwischenformat von Scala 3, das die vollständigen Typinformationen enthält und zum Beispiel Bibliotheken zwischen Compiler-Versionen austauschbar macht. Für @main def hallo legt der Compiler automatisch eine Klasse hallo mit einer passenden main-Methode an.
Kommentare
Zum Abschluss noch etwas, das Sie ab jetzt in jedem Beispiel sehen:
// einzeiliger Kommentar
/* mehrzeiliger
Kommentar */
/** Scaladoc-Kommentar: beschreibt die folgende Definition
* und erscheint in der erzeugten Dokumentation. */
def flaeche(breite: Double, hoehe: Double): Double = breite * hoehe