2014-10-30 18 views
10

Da Semikolons sind offenbar optional in Rust, warum, wenn ich dies tun:Sind in Rust Semikolon optional?

fn fn1() -> i32 {  
    let a = 1 
    let b = 2 
    3 
} 

ich den Fehler:

error: expected one of `.`, `;`, `?`, or an operator, found `let` 
--> src/main.rs:3:9 
    | 
2 |   let a = 1 
    |     - expected one of `.`, `;`, `?`, or an operator here 
3 |   let b = 2 
    |   ^^^ unexpected token 

?

Antwort

39

Sie sind nicht optional. Semikolons ändern das Verhalten einer Ausdrucksanweisung, so dass es eine bewusste Entscheidung sein sollte, ob Sie sie für eine Codezeile verwenden oder nicht.

Fast alles in Rust ist ein Ausdruck. Ein Ausdruck ist etwas, das einen Wert zurückgibt. Wenn Sie ein Semikolon setzen, unterdrücken Sie das Ergebnis dieses Ausdrucks, was in den meisten Fällen das ist, was Sie wollen.

Auf der anderen Seite bedeutet dies, dass das Ergebnis dieses letzten Ausdrucks zurückgegeben wird, wenn Sie Ihre Funktion mit einem Ausdruck ohne Semikolon beenden. Das Gleiche kann für einen Block in einer match Anweisung angewendet werden.

Sie können Ausdrücke ohne Semikolon verwenden, wo auch immer ein Wert erwartet wird.

Zum Beispiel:

let a = { 
    let inner = 2; 
    inner * inner 
}; 

Hier ist der Ausdruck inner * inner nicht mit einem Semikolon enden, so dass ihr Wert nicht unterdrückt wird. Da es der letzte Ausdruck im Block ist, wird sein Wert zurückgegeben und a zugewiesen. Wenn Sie in dieser Zeile ein Semikolon setzen, wird der Wert inner * inner nicht zurückgegeben.

In Ihrem speziellen Fall macht das Unterdrücken des Werts Ihrer let-Anweisung keinen Sinn, und der Compiler gibt Ihnen zu Recht einen Fehler. Tatsächlich ist let kein Ausdruck.

+0

Sie können diese https://rustbyexample.com/expression.html auch auf Ausdrücke überprüfen, die Semikolons enthalten. – nbro