Rust ist eine robuste und effiziente Programmiersprache. Eine der weniger bekannten Spracheigenschaften von Rust ist das Semikolon, das zur Eleganz der Sprache beiträgt. Es spielt eine zentrale Rolle bei der Gestaltung der Ausdruckskraft der Sprache. In diesem Artikel steigen wir in die Bedeutung des Semikolons im Zusammenhang mit Funktionsrückgabewerten und dem letzten Ausdruck eines Blocks ein.
Das Semikolon in Rust ist nicht nur ein Zeilenende, sondern auch ein stiller Kommunikator zwischen dem Rust-Entwickler und dem Compiler. Rust-Ausdrücke, die von einem Semikolon beendet werden, stellen Anweisungen dar. Anweisungen in Rust haben einerseits keinen Rückgabewert. Andererseits werden Ausdrücke am Ende eines Blocks ohne Semikolon als letzter Ausdruck eines Blocks betrachtet. Der Wert dieser Ausdrücke wird automatisch zum Rückgabewert (Return Value) des Blocks. Das ist eine auf die Bedeutung des Semikolons zugeschnittene Beschreibung von Ausdrücken (Expressions) und Anweisungen (Statements). Die Rust Programmiersprachdokumentation definiert Folgendes zu Expressions und Statements: „A statement is a component of a block, which is in turn a component of an outer expression or function.“ [1] Ferner: „A statement is a component of a block, which is in turn a component of an outer expression or function. Rust has two kinds of statements: declaration statements and expression statements.“ [2]
Steht ein Semikolon am Ende einer Zeile, handelt es sich um eine Anweisung. Das Semikolon erfüllt einen Zweck innerhalb des Blocks, jedoch trägt es nicht zum Rückgabewert bei. Umgekehrt signalisiert das Fehlen eines Semikolons, dass der Wert des Ausdrucks von Bedeutung ist, was den Ausdruck zu einem Kandidaten für den Rückgabewert macht. Am besten betrachten wir dies anhand des Beispiels in Listing 1 [3].
Listing 1
fn is_armstrong_number(num: u32) -> bool {
let num_str = num.to_string();
let exponent = num_str.len() as u32;
let sum: u64 = num_str
.chars()
.map(|x| x.to_digit(10).unwrap() as u64)
.map(|x| x.pow(exponent))
.sum();
sum == num as u64 // dies ist ein Ausdruck (return value)
}
Das Fehlen des Semikolons in der letzten Zeile des Funktionsblocks zeigt an, dass es sich um einen Ausdruck handelt. In diesem Fall bestimmt der (boolesche) Ausdruck den Rückgabewert der Funktion.
Würde die letzte Zeile des Funktionsblocks mit einem Semikolon beendet werden (Listing 2), wäre die letzte Zeile des Funktionsblocks eine Anweisung. Da die Funktion keine (anderen...