la rouille d'erreur “ne peut pas déterminer le type de cette expression”
-
12-12-2019 - |
Question
j'écris un simple rouille programme.
fn main(){
let port = 80;
result::chain(connect("localhost", port as u16)) {|s|
send(s,str::bytes("hello world"));
};
il y a une erreur sur elle.
macmatoMacBook-Air-2:rust-http kula$ rustc http.rs
http.rs:40:4: 40:52 error: cannot determine a type for this expression
http.rs:40 result::chain(connect("localhost", port as u16)) {|s|
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to previous errors
ce qui s'est passé sur elle?
La solution
Le compilateur n'a pas d'inférer le type que cette invocation de result::chain
elle est supposée retourner.C'est difficile à dire sans connaître les types de connect
et send
, mais je suppose que c'est parce que le corps de votre lambda bloc est (probablement à tort) résultant dans le néant type.
Le type de chaque bloc de rouille est déterminé par la 'queue' expression, et la queue expressions sont créés en laissant le point-virgule off de la déclaration finale.Sans doute, send
renvoie la result
type et c'est pourquoi vous utilisez result::chain
sur il - de sorte que le résultat de l'expression entière est le résultat de send
.Pour faire ce travail, l' send
l'expression ne doit pas être terminée par un point-virgule.Ensuite, votre lambda bloc sera de retour le résultat de send
.
Quelque chose comme cela peut fonctionner mieux:
fn main(){
let port = 80;
result::chain(connect("localhost", port as u16)) {|s|
send(s,str::bytes("hello world")) // <- no semicolon
};
}
Lors de l'inférence de type échoue, il peut parfois être utile de répartition des expressions en plus petite série de déclarations et d'insérer des types explicites jusqu'à ce que vous trouver les types ne correspondent pas correctement.Si j'ai touché quelque chose comme cela et ne pouvait pas le comprendre par eyeballing pendant un certain temps, alors je commence à le réécrire comme
fn main(){
let port = 80;
let conn_result: result::t<connection, str> = connect("localhost", port as u16);
let send_fn = fn@(s: connection) -> result::t<str, str> {
let send_result: result<str, str> = send(s,str::bytes("hello world"));
ret send_result;
};
let res: result<str, str> = result::chain(conn_result, send_fn);
}
Bien sûr, la substitution de ce que les types de connect
et send
utilisez effectivement.À un certain moment dans le processus de tirer tout en dehors, vous trouverez où vous et le compilateur en désaccord.