2014-07-01 17 views
5

Sto scrivendo una funzione rapida is_prime in ruggine, e sono rimasto impressionato dalla semplice scrittura true equivalente a return true;. Ma questo non è il caso nella mia funzione:perché la rimozione di ritorno mi dà un errore: atteso '()' ma trovato

fn is_prime(number: i64) -> bool { 
    for i in range(2i64, number) { 
     if number % i == 0 && i != number { 
      false 
     } 
    } 
    true 
} 

questo però mi darà l'errore:

"Error mismatched types: expected `()` but found `bool` (expected() but found bool) 

sostituzione true e false con return true;/return false; opere, ma perché con il precedente non compilare ?

+0

Btw, il 'i = controllo number' è inutile, dal momento che' range' non include il secondo punto finale (cioè si comporta come Python). Inoltre, la funzione può essere scritta come 'fn is_prime (numero: i64) -> bool {! Range (2, number) .any (| i | number% i == 0)}'. – huon

+0

@dbaupp: Scriverò 'fn is_prime (numero: i64) -> bool {range (2, number) .all (| i | number% i! = 0)}' invece. –

+0

@ChrisMorgan si dice "tutto no", io dico "no", dice de morgan "chi se ne frega": P (Inoltre, strano che il mio codice originale non sia formattato in codice: 'fn is_prime (numero: i64) -> bool {! range (2, number) .any (| i | number% i == 0)} '.) – huon

risposta

8

La ruggine è orientata all'espressione. In qualsiasi blocco, l'ultima espressione al suo interno è il valore del blocco. Pertanto, per una funzione, l'ultimo valore nel blocco viene considerato come valore di ritorno.

In altri blocchi, tuttavia, questo non è il caso - l'ultimo valore è, dopo tutto, considerato come il valore del blocco, non come un valore di ritorno per la funzione.

Prendete il frammento in isolamento con appena un po 'aggiunto per chiarezza:

let has_factor = if number % i == 0 && i != number { 
    false 
} 

Ciò significa che l'esito del if dichiarazione nel suo complesso è false se la clausola è vero, e che il valore è poi debitamente inserito nella variabile has_factor. Se la clausola è non true, verrà valutata la clausola else. Dato che non esiste un'altra clausola, è come se fosse stato scritto else { }, che equivale a else {() }. Questo blocco else valuta (), il tipo di unità. Ora abbiamo una discrepanza: è il blocco if (e quindi la variabile has_factor) del tipo bool, come richiede il blocco if o (), come richiede [la mancanza di] altro blocco? Questo è da dove viene l'errore.

Sommario: non si può semplicemente omettere la parola chiave return, perché non è quello che indica l'orientamento delle espressioni. Alla fine di una funzione , si riducono alla stessa cosa e il modulo sans-return deve essere preferito, ma in altre posizioni non sono equivalenti e return deve essere esplicito.

codice finale:

fn is_prime(number: i64) -> bool { 
    for i in range(2, number) { 
     if number % i == 0 && i != number { 
      return false; 
     } 
    } 
    true 
} 
+0

Inoltre, si noti che il valore di un'espressione for/while/loop è sempre '()'. –

Problemi correlati