rust - 为什么声明的泛型类型多于它使用的泛型类型的函数需要类型注释?

标签 rust

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/

相关文章:

import - 无法导入 StrBuf?

pointers - 为什么在 Rust 中访问指向结构的指针上的字段?

c - Rust,如何与 gethostname() std::libc 交互

rust - 如何在 Rust 的语句中使用 std::convert::Into?

windows - 尝试在 Windows 上编译时出错

postgresql - 在RUST中将Postgresql时间戳转换为字符串

rust - 为什么通过提取方法进行重构会触发借用检查器错误?

parsing - 转义字符串的命名解析器

vector - 获取向量中满足条件的所有索引

rust - 返回 Option 时有些不需要?