-1

私は簡単なさびプログラムを書きます。

fn main(){
    let port = 80;
    result::chain(connect("localhost", port as u16)) {|s|
    send(s,str::bytes("hello world"));
};

いくつかのエラーがあります。

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

何が起こったの?

4

1 に答える 1

4

result::chainコンパイラは、この呼び出しが返すことになっている型を推測できませんでした。connectとのタイプを知らなければ確実に判断するのは難しいsendですが、ラムダブロックの本体が(おそらく誤って)nilタイプになっているためだと思います。

rust内のすべてのブロックのタイプは、その「テール式」によって決定され、テール式は、最後のステートメントからセミコロンを外して作成されます。おそらく、型をsend返し、それがあなたがそれresultを使用している理由ですresult::chain-式全体の結果が。の結果になるようにsend。これを機能させるには、send式をセミコロンで終了しないでください。次に、ラムダブロックはの結果を返しますsend

このようなものがうまくいくかもしれません:

fn main(){
    let port = 80;
    result::chain(connect("localhost", port as u16)) {|s|
        send(s,str::bytes("hello world")) // <- no semicolon
    };
}

型推論が失敗した場合、式をより小さな一連のステートメントに分解し、型が正しく一致していない場所を特定するまで明示的な型を挿入すると役立つ場合があります。このようなものにぶつかって、しばらく目で見て理解できなかったら、次のように書き直します。

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);
}

もちろん、どんなタイプconnectでも代用してsend実際に使用します。すべてを引き離すプロセスのある時点で、自分とコンパイラが一致しない場所がわかります。

于 2012-03-12T00:11:22.247 に答える