编译:
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()
的类型信息?
答案 0 :(得分:7)
spawn
接受proc()
即没有参数的过程并返回值()
,因此编译器可以推断square
必须具有该类型的程序有效的。
proc
中的最后一个表达式是loop {}
,没有break
或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
行将让程序编译。