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
実際に使用します。すべてを引き離すプロセスのある時点で、自分とコンパイラが一致しない場所がわかります。