为什么将同一文件中的相同结构包含到多个包中会导致类型不匹配错误?

时间:2018-04-01 18:52:10

标签: compiler-errors rust

我创建了以下文件结构:

mod_test/src/
|- main.rs
|- a_module.rs
|- lib.rs

a_module.rs

pub struct A {}

lib.rs

mod a_module;
pub fn run(s: a_module::A) {}

main.rs

extern crate mod_test;

mod a_module;

fn main() {
    let b: a_module::A b = a_module::A {};
    mod_test::run(b);
}

lib文件中run函数的参数类型显然与b相同(除了命名空间,它在两种情况下都是A结构)。由于run是在另一个命名空间中导入的,编译器会告诉我存在类型不匹配:

expected: modTest::a_module::A -- got: a_module::A

我知道如何修复这种行为,但为什么会出现这种行为?

为什么编译器不能看到A结构完全相同,因为它指的是完全相同的文件?

1 个答案:

答案 0 :(得分:2)

就编译器而言,您不使用相同的类型。 Rust有名义输入,而不是结构类型。您可能熟悉TypeScript等语言的结构类型。

  

除了命名空间

命名空间(包括crate)是使类型唯一的一部分。您已在不同的包中多次导入同一文件。这与在不同模块中具有相同结构没有区别:

mod a {
    struct A;
}

mod b {
    struct A;
}

这些不应该是同一类型。

它们是同一个文件的事实对编译器来说并不重要。如果确实如此,那么围绕符号链接和硬链接就会出现奇怪的问题......

重要的是你将类型放在板条箱和模块层次结构中。

另见: