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

时间:2015-11-30 15:01:06

标签: 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.
}

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

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

1 个答案:

答案 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。这延伸到各种枚举和变体。