gpt4 book ai didi

rust - 无法推断出关于 _ 的足够类型信息;需要类型注释或通用参数绑定(bind)

转载 作者:行者123 更新时间:2023-11-29 07:52:57 25 4
gpt4 key购买 nike

trait Bar {
fn bar(&self);
}
enum Foo<T: Bar> {
F1,
F2(T)
}
struct Something;
impl Bar for Something {
fn bar(&self) {
}
}
fn main() {
let a = Foo::F2(Something); //<== this works fine.
let b = Foo::F1; //<== gives a compilation error.
}

编译错误 E0282:无法推断出关于 _ 的足够类型信息;需要类型注释或通用参数绑定(bind)。

我理解为什么编译器会提示,但似乎无法弄清楚如何在 F1 情况下不必为 T 分配类型。

最佳答案

枚举变体 没有自己的类型。只有枚举本身的类型。看看这个例子:

enum Thing<T> {
One,
Two(T),
}

fn main() {
let a = Thing::One;
let b = Thing::Two(true);
}

b 的类型是 Thing<bool> .该类型没有提及 Two . a 需要发生同样的事情, 但编译器无法使用任何东西来推断 T 的值,因此您必须明确提供:

let a = Thing::One::<u8>;

还有一个更小的例子是使用一个非常熟悉的内置枚举 — Option :

fn main() {
// let a = None;
let a = None::<u8>;
let b = Some(true);
}

I don't need the type T so it seems pointless to do so.

让我们深入探讨一下。一个枚举占据了所有变体的最大值的空间(加上一点点来区分它们):

enum Foo {
One(u64),
Two(u8),
}

fn main() {
println!("{}", std::mem::size_of::<u64>());
// 8
println!("{}", std::mem::size_of::<u8>());
// 1
println!("{}", std::mem::size_of::<Foo>());
// 16
}

此外,同一枚举的所有变体占用相同数量的空间:

fn main() {
let a = Some(true);
let b = None::<bool>;

println!("{}", std::mem::size_of_val(&a));
// 2
println!("{}", std::mem::size_of_val(&b));
// 2
}

这有助于让我们认识到并非所有None s 是相同的:

fn main() {
let a = None::<u8>;
println!("{}", std::mem::size_of_val(&a));
// 2

let b = None::<u64>;
println!("{}", std::mem::size_of_val(&b));
// 16
}

因此 重要的是要确切地知道是哪种 None你有。这扩展到每一种枚举和变体。

关于rust - 无法推断出关于 _ 的足够类型信息;需要类型注释或通用参数绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34001546/

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