gpt4 book ai didi

generics - Rust 编译器无法推断出有关泛型类型的足够信息

转载 作者:行者123 更新时间:2023-11-29 08:21:49 35 4
gpt4 key购买 nike

我正在学习 Rust 并且遇到了类似的东西

struct A<T> {
some_vec: Vec<T>,
pub secret: &'static str
}

struct B{}

struct C{}

impl B {
fn foo<T>(&self) {

let bar: A<T> = A {
some_vec: Vec::new(),
secret: "123"
};

println!("The secret is {}", bar.secret);
}
}

impl C {
fn foo<T>(&self) {
let b = B{};
b.foo();
}
}

fn main() {
let c = C{};
c.foo();
}

这会产生编译错误

error: unable to infer enough type information about `_`; type annotations or generic parameter binding required [--explain E0282]
--> src/main.rs:26:11
|>
26 |> b.foo();
|> ^^^

我看过关于相同错误消息的帖子,但在这种情况下我无法找出解决方案。我缺少指定哪些信息(与 b.foo() 相关)?

最佳答案

由于类型推断对于许多刚接触 Rust 的人来说是一种新鲜事物,所以让我们更深入地解释一下。

本质上,类型推断有点像您在杂志上玩过的那些“迷宫”游戏:

enter image description here

您在左侧有一堆类型未知的地方,可以连接到右侧的少数已知类型。如何?那么,通过检查类型之间的关系!

最简单的关系(无需猜测)是 1 度关系:

let x: String = "Hello, World".into();

在 Rust 中,我们知道 into()来自 Into<T> &str 实现的特征, 但是 T ?嗯,into()返回 T表达式的类型应为 String ,因此它必须Into<String> .

为了解决类型推断,编译器会因此在需要推断类型的地方和已知类型之间建立某种关系图(在Rust中,函数签名必须是显式的,所以它不应该有搜索太多),然后将尝试一点一点地推导类型。


让我们检查一下当前用例:

fn main() {
let c = C{};
c.foo();
}

在这里,c.foo();电话 C::foo<T>() :我们需要推断T .我们有什么信息?没有任何。 Zilch。纳达。

在这种情况下,无法解决问题,编译器退出并询问您(开发人员)您想要什么T成为。您可以通过多种方式指定它:

  • 一般方法是利用所谓的“turbofish”运算符 ::<>c.foo::<i32>()
  • 在无法推导出结果的特定情况下,您可以简单地为左侧变量指定一个类型,如let x: i32 = ...;
  • 需要注意的是,您通常不需要提供完整 类型,可以使用_。字符以省略它的一部分,如 let x: Vec<_> = ...;c.foo::<Vec<_>>()如果编译器有足够的信息来推断 _当然是靠自己。

关于generics - Rust 编译器无法推断出有关泛型类型的足够信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39195621/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com