2016-06-13 17 views
2
pub fn collect_prime_factors(number: i32) -> Vec<i32> { 
    let mut prime_factors = Vec::new(); 

    for i in 2..number { 
     if number % i == 0 { 
      collect_prime_factors(number/2); 
      prime_factors.push(i); 
      prime_factors 
     } 
    } 
} 

Fehler:Falscher Vektor Rückgabetyp für Rust Funktion

lib.rs:14:9: 14:22 error: mismatched types: 
expected `()`, 
    found `collections::vec::Vec<i32>` 
(expected(), 
    found struct `collections::vec::Vec`) [E0308] 
lib.rs:14   prime_factors 

Ich habe nicht das Problem hier. Ich erkläre eine Vec<i32> als Rückgabetyp. Warum erwartet man diese leeren Zahnspangen?

Warum funktioniert das nur, wenn ich es innerhalb einer Schleife verwende? Wenn ich die Schleife entferne und nur return prime_factors; funktioniert alles gut.

+1

Wie lautet der Aufruf von 'collect_prime_factors (number/2)'? Er berechnet einen neuen Vektor und wirft ihn weg. –

+0

semantisch falsch Ich habe es erst nach Rost erkannt, sagte mir diese neuen Ausgaben. Bitte ignoriere – xetra11

Antwort

3

Es gibt zwei Probleme (außer dem Einfügefehler).

Der angegebene Fehler bezieht sich nicht auf den Rückgabewert der Funktion. es ist der Wert des ifAusdruck:

pub fn collect_prime_factors(number: i32) -> Vec<i32> { 
    let mut prime_factors = Vec::new(); 

    for i in 2..number { 
     if number % i == 0 { 
      prime_factors.push(i); 
      prime_factors // This would be the value of the if 
     } 
    } 
} 

Rust wird erwartet keinen Rückgabewert zu sein, oder alternativ einen Wert von (), aber du bist Rückkehr prime_factors.

Wenn Sie dies beheben, sehen Sie, dass der nächste Fehler der umgekehrte ist, dass erwartet wird, dass die Funktion Vec<i32> zurückgibt, aber Sie geben () (nichts) zurück.

Ich denke, die richtige Sache hier ist, den Vektor am Ende der Funktion, wenn alle Faktoren gesammelt wurden, zurückzukehren:

pub fn collect_prime_factors(number: i32) -> Vec<i32> { 
    let mut prime_factors = Vec::new(); 

    for i in 2..number { 
     if number % i == 0 { 
      prime_factors.push(i); 
     }; 
    } 
    prime_factors // Return the vector from the function. 
} 

Playground link

(Aber diese Funktion nicht wirklich Rückkehr nur Primfaktoren!)

+0

Die nächste Iteration der Funktion wäre '(2..number) .filter (| & i | number% i == 0) .collect()'; produziert immer noch keine Primfaktoren ;-) – Shepmaster

+0

Aber warum gibt es eine Erwartung von nichts/leerem Tupel? Liegt es daran, dass die for-Schleife nicht mit Rückgabewerten eines Ausdrucks umgehen kann? Und wenn ich das Schlüsselwort "return" verwenden würde ... wäre das eine Lösung (kann nicht schreiben atm) – xetra11

+0

Ich fand diese Diskussion: https://github.com/rust-lang/rfcs/issues/961. Grundsätzlich glaube ich, dass es nicht offensichtlich ist, dass die Rückgabe eines Wertes aus einer Schleife (besonders als letzter Ausdruck) sinnvoll ist. Da es sich derzeit um einen Fehler handelt, könnte es in Zukunft zu Rust hinzugefügt werden, wenn eine Einigung besteht. –

Verwandte Themen