生锈错误“无法确定此表达式的类型”

时间:2012-03-11 23:46:51

标签: rust rust-obsolete

我写了一个简单的生锈程序。

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

发生了什么事?

1 个答案:

答案 0 :(得分:4)

编译器无法推断出result::chain的这个调用应该返回的类型。在不知道connectsend的类型的情况下很难确定,但我猜它是因为你的lambda块的主体是(可能是错误的)结果在零类型。

生锈中每个块的类型由它的尾部表达式确定,并且通过使分号离开最终语句来创建尾部表达式。据推测,send会返回result类型以及您在其上使用result::chain的原因 - 因此整个表达式的结果是send的结果。要使此工作,send表达式不应以分号结束。然后你的lambda块将返回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);
}

当然替换connectsend实际使用的任何类型。在将所有内容分开的某个过程中,您会发现您和编译器不同意的地方。