gpt4 book ai didi

带有通配符使用声明的 Rust 子模块行为

转载 作者:行者123 更新时间:2023-12-03 11:41:26 25 4
gpt4 key购买 nike

我试图了解使用通配符路径时(子)模块导入是如何工作的。我能想到的最简单的演示如下,其中两个模块,或者可能是两个 crate,共享相同的模块结构。

pub mod primary {
pub mod a {
pub mod b {
pub struct A(pub i32);
}
}
}

pub mod import {
pub use crate::primary::*;
// Compiles and executes fine with this commented out, but fails with
// "error[E0433]: failed to resolve: could not find `b` in `a`"
// otherwise. The error refers to the usage in the assert_eq macro
// pub mod a {}
}

fn main() {
assert_eq!(import::a::b::A(42).0, 42);
}
我的一般想法是,从第一个案例开始, pub mod a {}被注释掉的作品,通配符应该将通配符拾取的所有子模块扩展到它正在扩展的路径中的子模块中。不是这样吗?如果是这样,思考的适当方式是什么?
Use declarations对此没有太多细节。

最佳答案

use*导入所有名称,除了那些与当前模块中已经存在的名称冲突的名称。
比较:

pub mod primary {
pub fn f() {
println!("p::f");
}
}

pub mod import {
pub use crate::primary::*;
}

fn main() {
import::f();
}
其中 prints p::f
pub mod primary {
pub fn f() {
println!("p::f");
}
}

pub mod import {
pub use crate::primary::*;

pub fn f() {
println!("import::f");
}
}

fn main() {
import::f();
}
其中 prints import::f .

这对于函数和常量来说似乎很明显(否则它会使 * 非常有限,上游库不可能在不冒破坏下游用户的情况下添加任何项目),但对于模块来说似乎更令人困惑。
您必须记住,您不能多次定义一个模块(即“重新打开”一个模块)。以下是非法的:
pub mod primary {
pub mod a {}
pub mod a {}
}
fails with
error[E0428]: the name `a` is defined multiple times
--> src/lib.rs:3:5
|
2 | pub mod a {}
| --------- previous definition of the module `a` here
3 | pub mod a {}
| ^^^^^^^^^ `a` redefined here
|
= note: `a` must be defined only once in the type namespace of this module

您可以通过再添加一个级别来解决这种特殊情况:
pub mod primary {
pub mod a {
pub mod b {
pub struct A(pub i32);
}
}
}

pub mod import {
pub mod a {
pub use crate::primary::a::*;
}
}

fn main() {
assert_eq!(import::a::b::A(42).0, 42);
}

关于带有通配符使用声明的 Rust 子模块行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66630815/

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