gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:27:01 26 4
gpt4 key购买 nike

我创建了以下文件结构:

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) {}

ma​​in.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 结构是完全相同的,因为它指的是完全相同的文件?

最佳答案

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

except for the namespace

namespace (包括 crate)是使类型独一无二的一部分。您已在不同的 crate 中多次导入相同的文件。这与在不同模块中使用相同的结构没有什么不同:

mod a {
struct A;
}

mod b {
struct A;
}

这些不应该是同一类型。

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

重要的是您将类型放置在 crate 和模块层次结构中的什么位置。

另见:

关于compiler-errors - 为什么将同一文件中的相同结构包含到多个包装箱中会导致类型不匹配错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49601527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com