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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top