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.
}
Run Code Online (Sandbox Code Playgroud)
编译错误E0282:无法推断出足够的类型信息_
; 需要输入注释或通用参数绑定.
我理解为什么编译器抱怨,但似乎无法弄清楚如何做到这一点,而不必在F1情况下为T分配类型.
枚举变体没有自己的类型.只有枚举本身的类型.看看这个例子:
enum Thing<T> {
One,
Two(T),
}
fn main() {
let a = Thing::One;
let b = Thing::Two(true);
}
Run Code Online (Sandbox Code Playgroud)
类型b
是Thing<bool>
.这种类型没有提到Two
.同样的事情需要发生a
,但编译器没有什么可以用来推断它的值T
,所以你必须明确地提供它:
let a = Thing::One::<u8>;
Run Code Online (Sandbox Code Playgroud)
更小的例子是使用内置且非常熟悉的枚举 - Option
:
fn main() {
// let a = None;
let a = None::<u8>;
let b = Some(true);
}
Run Code Online (Sandbox Code Playgroud)
我不需要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
}
Run Code Online (Sandbox Code Playgroud)
此外,相同枚举的所有变体占用相同的空间量:
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
}
Run Code Online (Sandbox Code Playgroud)
这有助于我们认识到并非所有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
}
Run Code Online (Sandbox Code Playgroud)
因此,它是重要的是要知道什么样的None
你.这延伸到各种枚举和变体.
归档时间: |
|
查看次数: |
643 次 |
最近记录: |