【问题标题】:Unable to infer enough type information about _; type annotations or generic parameter binding required无法推断出足够的关于 _ 的类型信息;需要类型注释或泛型参数绑定
【发布时间】:2015-11-30 15:01:06
【问题描述】:
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 分配类型。

【问题讨论】:

  • 无需为 T 分配类型 — 为什么不想为 T 分配具体类型?
  • 好吧,我的意思是在 F1 的情况下,我不需要 T 类型,所以这样做似乎毫无意义。如果没有办法做到这一点,我可以忍受在所有情况下为 T 分配一个类型。
  • 您可以为T 指定一个默认值,但它似乎与推理有问题:This 不起作用,但 this 起作用。
  • 啊,这只是一个尚未稳定的功能:github.com/rust-lang/rust/issues/29101,现在可以使用:is.gd/GIiHHP
  • 感谢您的回答,但默认值不是我想要的。我跟着 Shepmaster adivce 并像这样解决了它is.gd/lz8TRr

标签: rust


【解决方案1】:

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

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

fn main() {
    let a = Thing::One;
    let b = Thing::Two(true);
}

b 的类型是 Thing&lt;bool&gt;。该类型没有提及Twoa 需要发生同样的事情,但是编译器无法使用任何东西来推断 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
}

这有助于我们认识到并非所有Nones 都是相同的

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 的具体类型很重要。这扩展到每一种枚举和变体。

【讨论】:

  • 不知道您可以键入注释无。这让我很头疼!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多