我的私有代码在哪里暴露为 public?
Where is my private code exposed as public?
我发现我的代码库中有一些死代码,但没有收到预期的死代码警告。我阅读了 rust 书中的 Visibility and Privacy 文章。我正在按照创建 "helper module" 的示例进行操作,其中包含要在板条箱中使用但未在 public API.
中公开的代码
这是我认为正在发生的事情的一个简化示例:
// private module for in-crate usage only
mod foo {
// everything in the module is pub
pub struct Foo {}
impl Foo {
// I expect to see a dead code warning here. Where is it? ...
pub fn dead_code() {}
}
}
use foo::Foo;
// Uh oh, I'm leaking my helper module here!
// But I'm having trouble finding where this occurs in my large code base :(
pub fn get_foo() -> Foo {
Foo {}
}
我的问题:我如何找到 "leaking" 的代码 (get_foo
) 作为 public 我想要的 crate-public (Foo
)?在一个真实的例子中,可能有一个 "leak" 具有泄漏相关类型的多米诺骨牌效应。
pub(crate)
是惯用语,可以解决您的问题。
// helper module for in-crate usage only
mod foo {
pub(crate) struct Foo {}
impl Foo {
// Dead code warning!
pub(crate) fn dead_code() {}
}
}
use foo::Foo;
// pub(crate) prevents leaking helper module here!
pub(crate) fn get_foo() -> Foo {
Foo{}
}
此代码生成(多个)死代码警告
为了证明 pub(crate)
防止泄漏非 pub 项,将最后一个函数更改为
pub fn get_foo() -> Foo {
Foo{}
}
给出编译错误 - error[E0446]: crate-visible type foo::Foo in public interface
我认为书中的示例不建议使用 pub(crate)
,因为该部分是在本书介绍 pub(restricted)
的概念之前编写的。如果你看the RFC for pub(restricted)
,它会明确指出你做了什么
(2.) you can define X as a pub item in some submodule (and import into the root of the module tree via use).
But: Sometimes neither of these options is really what you want.
我发现我的代码库中有一些死代码,但没有收到预期的死代码警告。我阅读了 rust 书中的 Visibility and Privacy 文章。我正在按照创建 "helper module" 的示例进行操作,其中包含要在板条箱中使用但未在 public API.
中公开的代码这是我认为正在发生的事情的一个简化示例:
// private module for in-crate usage only
mod foo {
// everything in the module is pub
pub struct Foo {}
impl Foo {
// I expect to see a dead code warning here. Where is it? ...
pub fn dead_code() {}
}
}
use foo::Foo;
// Uh oh, I'm leaking my helper module here!
// But I'm having trouble finding where this occurs in my large code base :(
pub fn get_foo() -> Foo {
Foo {}
}
我的问题:我如何找到 "leaking" 的代码 (get_foo
) 作为 public 我想要的 crate-public (Foo
)?在一个真实的例子中,可能有一个 "leak" 具有泄漏相关类型的多米诺骨牌效应。
pub(crate)
是惯用语,可以解决您的问题。
// helper module for in-crate usage only
mod foo {
pub(crate) struct Foo {}
impl Foo {
// Dead code warning!
pub(crate) fn dead_code() {}
}
}
use foo::Foo;
// pub(crate) prevents leaking helper module here!
pub(crate) fn get_foo() -> Foo {
Foo{}
}
此代码生成(多个)死代码警告
为了证明 pub(crate)
防止泄漏非 pub 项,将最后一个函数更改为
pub fn get_foo() -> Foo {
Foo{}
}
给出编译错误 - error[E0446]: crate-visible type foo::Foo in public interface
我认为书中的示例不建议使用 pub(crate)
,因为该部分是在本书介绍 pub(restricted)
的概念之前编写的。如果你看the RFC for pub(restricted)
,它会明确指出你做了什么
(2.) you can define X as a pub item in some submodule (and import into the root of the module tree via use).
But: Sometimes neither of these options is really what you want.