2014-10-30 13 views
10

Dal punto e virgola sono apparentemente opzionale a Rust, perché, se faccio questo:I punti e virgola sono opzionali in Rust?

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

ottengo l'errore:

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 

?

risposta

39

Non sono opzionali. I punti e virgola modificano il comportamento di un'espressione di espressione in modo che dovrebbe essere una decisione consapevole se li si utilizza o meno per una riga di codice.

Quasi tutto in Rust è un'espressione. Un'espressione è qualcosa che restituisce un valore. Se metti un punto e virgola stai sopprimendo il risultato di questa espressione, che nella maggior parte dei casi è ciò che desideri.

D'altra parte, ciò significa che se si termina la propria funzione con un'espressione senza punto e virgola, verrà restituito il risultato di quest'ultima espressione. Lo stesso può essere applicato per un blocco in un'istruzione match.

È possibile utilizzare le espressioni senza punto e virgola in qualsiasi altro punto in cui è previsto un valore.

Ad esempio:

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

Qui l'espressione inner * inner non termina con una virgola, quindi il suo valore non è soppressa. Poiché è l'ultima espressione nel blocco, il suo valore verrà restituito e assegnato a a. Se si inserisce un punto e virgola su questa stessa riga, il valore di inner * inner non verrà restituito.

Nel tuo caso specifico, non eliminare il valore della tua istruzione let non ha senso e il compilatore ti dà giustamente un errore. Infatti, let non è un'espressione.

+0

È anche possibile controllare questo https://rustbyexample.com/expression.html su espressioni che menzionano anche punti e virgola. – nbro