我创建了以下文件结构:
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
结构完全相同,因为它指的是完全相同的文件?
答案 0 :(得分:2)
就编译器而言,您不使用相同的类型。 Rust有名义输入,而不是结构类型。您可能熟悉TypeScript等语言的结构类型。
除了命名空间
命名空间(包括crate)是使类型唯一的一部分。您已在不同的包中多次导入同一文件。这与在不同模块中具有相同结构没有区别:
mod a {
struct A;
}
mod b {
struct A;
}
这些不应该是同一类型。
它们是同一个文件的事实对编译器来说并不重要。如果确实如此,那么围绕符号链接和硬链接就会出现奇怪的问题......
重要的是你将类型放在板条箱和模块层次结构中。
另见: