1

这编译:

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()a 的类型信息有什么特别之处?proc()

4

1 回答 1

7

spawn采用proc()ie 一个没有参数和返回值的过程(),因此编译器可以推断square必须具有该类型才能使程序有效。

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

只需一个普通的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 {};
                 ^

围栏

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

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

于 2014-11-26T22:31:02.580 回答