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
}
fonte
2014-07-01 04:14:33
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
@dbaupp: Scriverò 'fn is_prime (numero: i64) -> bool {range (2, number) .all (| i | number% i! = 0)}' invece. –
@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