3

我发现我的代码库中有一些死代码,但没有按预期收到死代码警告。我从 rust book 中阅读了Visibility and Privacy文章。我正在按照示例创建一个“帮助模块”,其中包含要在板条箱中使用但未在公共 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 {}
}

我的问题:我如何找到get_foo“泄露”为公共的代码(),我打算成为 crate-public(Foo)?在一个真实的例子中,可能有一个“泄漏”具有泄漏相关类型的多米诺骨牌效应。

4

1 回答 1

3

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 fn get_foo() -> Foo {
    Foo{}
}

给出编译错误 -error[E0446]: crate-visible type foo::Foo in public interface

我认为本书的示例不建议使用pub(crate),因为该部分是在本书介绍pub(restricted). 如果您查看RFCpub(restricted),它会明确指出您所做的

(2.) 您可以将 X 定义为某个子模块中的 pub 项(并通过 use 导入到模块树的根目录中)。

但是:有时这些选项都不是您真正想要的。

于 2020-06-05T08:46:37.773 回答