枚举变体没有自己的类型。只有枚举本身的类型。看看这个例子:
enum Thing<T> {
One,
Two(T),
}
fn main() {
let a = Thing::One;
let b = Thing::Two(true);
}
的类型b
is a 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
}
这有助于我们认识到not all 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
}
Thus it is重要的是要确切地知道什么样的None
你有。这扩展到每种枚举和变体。