Rust 把 'pub' 搞错了

发布: (2025年12月25日 GMT+8 01:44)
5 min read
原文: Dev.to

Source: Dev.to

Cover image for Rust got 'pub' wrong

Rust 中的 pub 关键字

pub 关键字是 Rust 的访问修饰符,用来使函数、结构体、枚举、特性以及模块等项目在其定义模块之外可访问。从这个意义上,它的行为类似于许多其他语言中的 public

与 JavaScript/TypeScript 的对比

一个主要区别——尤其是当你来自 JavaScript 时——体现在默认行为上。

在 JS/TS 中,类的方法默认是公开的(除非你使用 #private 关键字显式标记为私有)。其底层假设是大多数类方法应该是可访问的,因此不需要不断在方法签名上添加可见性关键字。可以把这称为 约定优于配置

Rust 本可以借鉴这种思路,但它走向了相反的方向:默认私有,显式声明为公开

pub 的视觉噪声

结果是你经常会看到类似下面的代码:

Rust pub keyword litter

一堆 pub 到处乱飞。

如果默认行为相反,代码可能会更简洁——类似 Rust 处理 mut 关键字的方式。变量默认是不可变的,当你显式添加 mut 时,立刻表明该值以后会改变。这种信号既是心理暗示也是技术提示。

现在,pub 并没有同样的信号作用,因为它随处可见,成为视觉噪声。如果 Rust 选择 默认公开,那么显式标记为 private 就可以像今天的 mut 那样发挥作用。看到 private 关键字会立刻告诉读者:“这有意被隐藏,请不要依赖它。”

换句话说,代码会更像:

“这里的所有内容都应该是可访问的——除了这些特定的东西。”

而不是:

“我们想让这个、这个、这个、这个……都是公开的。”

重要说明:基于模块的可见性

有一点需要纠正,为什么这种比较会显得有点不对称。Rust 的可见性是 基于模块 的,而不是基于类的。在 JavaScript(以及许多面向对象语言)中,可见性主要作用于类。Rust 中,可见性作用于模块,模块充当显式的 API 边界。这意味着 Rust 不仅仅是保护字段和方法——它在保护整个命名空间和架构层次。

因此,“默认私有”并非仅仅是风格上的选择。它强烈鼓励:

  • 有意的 API 设计
  • 最小化公开表面
  • 减少意外的破坏性更改
  • 更清晰的不变量所有权

这在为大型、长期运行的系统和库设计的语言中尤为重要。

Rust 在这里错了吗?

可能没有。但可用性(ergonomics)争论是否成立?绝对成立。

Rust 用冗长换取正确性和稳定性,这在语言设计层面上是有道理的,但它确实带来了可读性成本——尤其是对来自 JS/TS 的人来说,公共 API 往往是暗示而非声明的。

这种权衡是否值得,取决于你更看重什么:

  • 视觉上的整洁
  • 还是毫不妥协的显式性

Rust 显然选择了后者。

你怎么看?

Back to Blog

相关文章

阅读更多 »