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:无法推断出有关_
的足够类型信息;需要输入注释或通用参数绑定。
我理解为什么编译器会抱怨,但似乎无法弄清楚如何在F1情况下不必为T分配类型。
答案 0 :(得分:7)
枚举变体没有自己的类型。只有枚举本身的类型。看看这个例子:
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);
}
我不需要T型,所以这样做似乎毫无意义。
让我们深入了解一下。枚举占据所有变体的最大空间(加上一点点来区分它们):
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
都相同:
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
。这延伸到各种枚举和变体。