使用库、二进制文件和模块文件限制项目中的模块功能可见性
Posted
技术标签:
【中文标题】使用库、二进制文件和模块文件限制项目中的模块功能可见性【英文标题】:Restrict module function visibility in a project with library, binary and a module file 【发布时间】:2022-01-19 00:16:02 【问题描述】:我有一个包含三个文件的项目:
-
模块文件 (
src/foo.rs
)
库文件 (src/lib.rs
)
二进制文件 (src/main.rs
)
我想在模块文件中拥有公共函数,其可见性仅限于库和二进制文件。
我曾尝试使用pub(crate)
、pub(super)
等,但无济于事。
我想以这样的方式设计项目结构:
-
在将
lib.rs
中的pub
函数用作依赖包时,只能从外部调用它。
foo.rs
中的所有函数都应该只对lib.rs
和main.rs
可见。
main.rs
中的所有函数都应该是私有的。
EDIT1:我想要它,因为pub(crate)
会警告我死代码,而pub
不会。我不希望模块中有任何死代码。在大型项目的维护中,对调试和重构有很大帮助。
EDIT2:Rust Internals Thread
【问题讨论】:
main.rs
是否依赖 lib.rs
作为依赖项,您是否希望 main.rs
通过 lib.rs
访问 foo.rs
?
@kmdreko 那同样的事情没有?
你的问题没有任何意义,xy 问题?我建议你忘记这个想法。至少你应该解释为什么你想要那个。
只有 lib.rs 中的 pub 函数——这就是 Rust 的自然工作方式;没有什么特别的需要。 main.rs 中的所有函数——它们是否是私有的并不重要,因为你一开始就不能将二进制文件用作依赖项。 foo.rs 中的所有函数 — 是什么让 your main.rs 与任何其他可能使用该库的 crate 不同? Rust 中没有任何东西有你信任的“朋友”箱子的概念。
@Stargatuer 我主要是在问lib.rs
和main.rs
是否都分别声明foo
模块。
【参考方案1】:
pub
就是这样做的。
对于 foo.rs 中的这些函数,您需要使用 pub(crate)
。
由于 main.rs 是二进制文件,因此无法导入,因此它们本质上都是私有的。
【讨论】:
以上是关于使用库、二进制文件和模块文件限制项目中的模块功能可见性的主要内容,如果未能解决你的问题,请参考以下文章