无法推断出关于_的足够类型信息; 需要输入注释或通用参数绑定

Wim*_*m V 4 rust

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分配类型.

She*_*ter 7

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

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

fn main() {
    let a = Thing::One;
    let b = Thing::Two(true);
}
Run Code Online (Sandbox Code Playgroud)

类型bThing<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你.这延伸到各种枚举和变体.