如果没有传递给spawn(),则无法推断proc()的类型信息

时间:2014-11-26 19:53:48

标签: rust rust-obsolete

编译:

use std::num::pow;

pub fn main() {
    let (tx, rx): (Sender<u64>, Receiver<u64>) = channel();
    let square_tx = tx.clone();

    let square = proc() {
        let mut x = 1u;
        loop {
            square_tx.send(pow(2u64, x));
            x += 1;
        }
    };

    let printer = proc() {
        loop { println!("Received: {}", rx.recv()); }
    };

    spawn(square);
    spawn(printer);
}

但如果我注释掉spawn(square),则会引发以下错误:

error: unable to infer enough type information about `_`; type annotations required
let square = proc() {
                    ^

spawn()有什么特别之处,以便在没有产生的情况下无法推断出proc()的类型信息?

1 个答案:

答案 0 :(得分:7)

spawn接受proc()即没有参数的过程并返回值(),因此编译器可以推断square必须具有该类型的程序有效的。

proc中的最后一个表达式是loop {},没有breakreturn,因此编译器可以看到闭包永远不会正确返回。也就是说,它可以假装具有任何类型的返回值。由于返回类型不受限制,编译器无法告诉哪一个是想要的,所以抱怨。

只有普通的loop {}可以看到类似的行为。

fn main() {
    let x = loop {};

    // code never reaches here, but these provide type inference hints
    // let y: int = x;
    // let y: () = x;
    // let y: Vec<String> = x;
}
<anon>:2:9: 2:10 error: unable to infer enough type information about `_`; type annotations required
<anon>:2     let x = loop {};
                 ^

playpen

(对于编译器可以告诉的任何事情都不会发生同样的事情,不让控制流继续,例如let x = panic!();let x = return;。)

取消注释其中一个y行将让程序编译。