2017-05-21 1 views
0

Ich habe eine Funktion, die Result<Vec<&str>, String> für eine Liste der Knoten zurückgibt. Meine Absicht ist es, nach einem Fehler oder einem leeren Vektor zu suchen, um früh zurückzukehren oder fortzufahren, wenn dort eine Liste ist.Entspricht entweder einem Fehler oder einem leeren Ergebnis

Dies ist, was ich unter anderem versuche, aber der Compiler beklagt sich über den Typ x.

let nodes = list_nodes(client, &service); 
match nodes { 
    Err(e) => { 
     println!("Unable to list nodes: {:?}", e); 
     return; 
    }, 
    Ok(x) if x.as_slice() == [] => { 
     println!("No nodes found for service: {}", service); 
     return; 
    } 
    _ => {} 
} 

Der Fehler ist:

error[E0282]: type annotations needed 
    --> src/main.rs:28:18 
    | 
28 |   Ok(x) if x.as_slice() == [] => { 
    |     ^^^^^^^^^^^^^^^^^^ cannot infer type for `A` 
+0

Ich denke, Sie müssen mehr Code für den Kontext hinzufügen. Beispiel: In der Fehlermeldung steht "A", nicht jedoch in Ihrem Codebeispiel. Bitte siehe https://StackOverflow.com/Help/Mcve –

+0

@PeterHall, es gibt keine A in meinem Code, was Sie sehen, ist, was ich vom Compiler bekomme, gibt es keinen Kontext mehr, den ich geben könnte. –

+0

@Arkaitz, versuche '& x == & []'. Jetzt vergleichen Sie die Scheibenreferenz und ein leeres Array. – red75prime

Antwort

2

Das Problem ist eigentlich, dass es nicht die Art von [] ableiten kann. Der Typ-Checker kann nicht davon ausgehen, dass [] hier den gleichen Typ wie x.as_slice() hat, da das Merkmal PartialEq (wobei == stammt) Fälle zulässt, in denen die rechte Seite von einem anderen Typ ist als links. Sie können es leicht an der Scheibe die Länge statt oder die Überprüfung der Suche lösen, wenn die Scheibe mit is_empty() leer ist:

match nodes { 
    Err(e) => { 
     println!("Unable to list nodes: {:?}", e); 
     return; 
    }, 
    Ok(ref x) if x.as_slice().is_empty() => { 
     println!("No nodes found for service: {}", service); 
     return; 
    } 
    _ => {} 
} 

Auch ein Verweis auf x nehmen (mit ref x wie ich oben getan haben) wird verhindert, dass ein anderer Fehler, den Sie wahrscheinlich erhalten werden, zu vermeiden, Verschieben x, wenn es noch im Besitz von nodes ist.

+1

Dank !, endete ich mit 'Ok (ref x) if x.is_empty()', da kein Ausschnitt extrahiert werden muss –

Verwandte Themen