我的私有代码在哪里暴露为 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.