fn lifetime_tester<A, B, C>(a: Box<A>, b: Box<B>, c: &i32) -> &i32 {
c
}
fn main() {
let a = Box::new(String::from("Test1"));
let b = Box::new(55 as i32);
let c: i32;
{
c = 34 as i32;
}
println!("{}", lifetime_tester(a, b, &c));
}
错误:
error[E0282]: type annotations needed
--> src/main.rs:12:20
|
12 | println!("{}", lifetime_tester(a, b, &c));
| ^^^^^^^^^^^^^^^ cannot infer type for `C`
我对“类型注释”需要去哪里感到困惑。我已将返回类型指定为 &i32
,我已将参数类型指定为 &i32
,并且我还指定了 c
是一个i32
。
最佳答案
因为你的函数的参数和通用类型之间没有联系 C
, 编译器不知道你要替换哪种类型 C
在函数调用中。在这种情况下,您的代码甚至不使用类型 C
所以没关系,但 Rust 非常重视“局部推理”——即它不会偷看你的函数内部来确定你没有使用 C
在语法检查阶段。
您可以使用“turbofish”运算符明确告诉它您的类型,::<>
, 像这样
println!("{}", lifetime_tester::<_, _, i32>(a, b, &c));
关于rust - 为什么声明的泛型类型多于它使用的泛型类型的函数需要类型注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53273517/