为了方便起见,我的代码中有很多重新导出,但有时我想明确排除一些东西,以避免可能的命名混乱或冲突的实现.

来自Scala,我预计下面的代码不会编译(我不希望它编译),因为Bar as _语法将从导入中删除Bar.然而,这仍然会被编译.有没有什么Rust语法可以做我想要的?

pub mod stuff{
    pub struct Foo{}
    pub struct Bar{}
}

pub mod other_stuff{
    use super::stuff::{*, Bar as _};
    pub struct Baz{
        foo : Foo,
        bar : Bar
    }
}

需要说明的是,除了Bar之外,我想要从stuffuse.(obv在本例中,我只能导入Foo个,但我的实际用例有很多导入,我不想逐一列出它们.)

编辑:我仍然想知道如何做到这一点,但我意识到我在激励别人的例子中犯了一个奇怪的错误.在这里发帖是为了了解背景,以防其他人被同样的事情绊倒.基本上,我的实际情况是这样的:

pub mod stuff{
    pub struct Foo;
    pub struct Bar;
}

pub mod yet_more_stuff{
    use super::stuff::*;
    pub struct Bar{}
    pub struct Baz{
        pub foo : Foo,
        pub bar : Bar
    }
    impl Baz{
        pub fn new() -> Self{
            Self{
                foo : Foo,
                bar : Bar
            }
        }
    }
}

上面的代码块没有编译;因为我在一个地方将Bar定义为struct Bar;,在另一个地方将其定义为struct Bar{},因此Baz中的类型是yet_more_stuff:Bar,而Baz::new()中构造的值是stuff::Bar.这看起来是相互冲突的,而不是像下面的答案所描述的那样优先.

推荐答案

在Rust中没有针对这一点的语法.

但是,请注意,特定导入始终优先于全局导入,因此如果您有use stuff::*use other_stuff::Bar,其中stuff也包含Bar,则不会有冲突,并且始终会 Select other_stuff中的Bar.只会在两个全局导入或两个特定导入之间发生冲突.

但是,一般来说,不鼓励全局导入,最好使用特定的导入,特别是如果您不想导入everything.

Rust相关问答推荐

通用池类型xsx

如何从Rust记录WASM堆内存使用情况?

当Option为None时,Option数组是否占用Rust中的内存?

如何使用字符串迭代器执行查找?

下载压缩文件

如何编写一个以一个闭包为参数的函数,该函数以另一个闭包为参数?

在我的Cargo 中,当我在建筑物中使用时,找不到我可以在产品包中使用的 crate .r我如何解决这个问题?

我如何制作一个变异迭代器来锁定内部数据直到删除?

零拷贝按步骤引用一段字节

实现 Deref 的 struct 可以返回对外部数据的引用吗?

如何将 struct 数组放置在另一个 struct 的末尾而不进行内存分段

tokio::sync::broadcast::Receiver 不是克隆

在线程中运行时,TCPListener(服务器)在 ip 列表中的服务器实例之前没有从客户端接受所有客户端的请求

将 Futures 的生命周期特征绑定到 fn 参数

使用 `clap` 在 Rust CLI 工具中设置布尔标志

仅在运行测试时生成调试输出

Rustlings 切片原语

Cargo:如何将整个目录或文件包含在功能标志中?

Rustfmt 是否有明确类型的选项?

将 (T, ()) 转换为 T 安全吗?