rustc可以为我提供有关类型歧义错误的更多详细信息吗?

时间:2019-09-22 16:34:27

标签: compiler-errors rust

存在此熟悉的编译错误:

error[E0283]: type annotations required: cannot resolve `T: Constraint`

...

然后rustc --explain E0283说:This error occurs when the compiler doesn't have enough information to unambiguously choose an implementation,并给出一个state_dict

我确切地知道如何解决该错误-例如helpful example

不过,我想知道是否可以鼓励rustc告诉我更多信息。具体来说,是类型检查器最终在保存之前可能出现的具体类型的空间的某种表示形式。

2 个答案:

答案 0 :(得分:1)

我找不到任何rustc选项来提供有关E0283的更多信息;但是the code for this error包含的评论可能会给您带来更多的见解。否则,看来您问题的答案是否定的。抱歉,我无法获得更多帮助。

答案 1 :(得分:1)

当类型检查器无法推断出明确的类型时,并不一定意味着它无法从有限的已知竞争者集中进行选择。您从文档中引用的Here is the example

trait Generator {
    fn create() -> u32;
}

struct Impl;

impl Generator for Impl {
    fn create() -> u32 { 1 }
}

struct AnotherImpl;

impl Generator for AnotherImpl {
    fn create() -> u32 { 2 }
}

fn main() {
    let cont: u32 = Generator::create();
    // error, impossible to choose one of Generator trait implementation
    // Should it be Impl or AnotherImpl, maybe something else?
}

如果没有AnotherImpl,并且ImplGenerator only 实现,那么这仍然行不通。如果是这样,您以后可以添加AnotherImpl(甚至在另一个模块或板条箱中)并破坏此代码。通常,添加新定义应该是不间断的,并且当然不能破坏其他模块中的代码。如果编译器在此处自动选择Generator的“唯一”实现,则会违反该要求。

回到您的原始问题,该错误消息可以为您提供的唯一信息几乎就是已经为您提供的信息。类型检查器并未四处寻找可能的实现,只是拒绝甚至尝试从给定的信息中选择类型。