公有成员与私有成员之间的中间可见性
摘要
一场关于 Rust(或未来语言)是否应该为结构体字段添加 `read` 可见性修饰符的 Lobsters 讨论:允许对外提供只读访问而不可写,并询问是否存在隐藏的语言设计陷阱以及合理的默认行为。
<p>假设我有这样一个结构体</p>
<p><code>struct Foo { pub public: Bar, restricted: Qux }</code></p>
<p>其中 ‘restricted’ 是一个成员变量,我希望在结构体方法之外能够读取它,但不能修改它。通常我会写一个 getter 方法</p>
<p><code>impl Foo { pub fn restricted(&self) -> &Qux { self.restricted }}</code></p>
<p>这并不需要写多少代码,而且我可能可以通过 IDE 或插件自动生成这些方法。</p>
<p>但话说回来,为什么不把这一点直接内置到声明语法中呢?在 <code>private</code>(在 Rust 中是隐式的,但有些语言是显式的)和 <code>public</code> 之间加一个修饰符。比如用 <code>read</code>,这样我们就能写成</p>
<p><code>struct Foo { x, read y, pub z }</code></p>
<p>其中 x 对结构体而言是真正的私有成员,只有成员函数才能读写;y 任何人都可以读取,但不能随意修改;z 任何人都可以读写?</p>
<p>这需要区分对 foo.y 的访问和修改(访问 vs 可变),这可能并不简单,但看起来也并非特别困难。</p>
<p>我很好奇这里是否存在隐藏的陷阱,使其从语言设计的角度来看复杂得多,或者不如我预想的那样符合人体工程学。如果没有的话,这似乎是未来语言可以实现的一个直接特性,我认为值得为它增加一个关键字。</p>
<p>而且,如果这是可行且可取的,那么默认行为应该是什么?如果三种状态都存在的话,将只读作为默认值似乎比完全私有更合理一些。</p>
<p>期待听到大家的想法。</p>
查看缓存全文
缓存时间: 2026/10/20 08:10
# 公共成员与私有成员之间的中间状态
来源:https://lobste.rs/s/fonp7g/intermediary_between_public_private
假设我有这样一个结构体:
```rust
struct Foo { pub public: Bar, restricted: Qux }
```
其中 `restricted` 是一个成员变量,我希望能从结构体方法外部读取它,但不能修改它。通常我会写一个 getter 方法:
```rust
impl Foo { pub fn restricted(&self) -> &Qux { self.restricted }}
```
这需要写不少代码,而且大概可以用 IDE 或插件自动生成。
但话又说回来,为什么不把这个功能直接内置到声明语法中呢?在 `private`(Rust 中是隐式的,但有些语言有这个关键字)和 `public` 之间加一个修饰符,比如 `read`,这样我们就可以写成:
```rust
struct Foo { x, read y, pub z }
```
其中 x 是真正的私有成员,只能被成员函数读写;y 可以被任何人读取,但不能随意修改;z 则可以被任何人读写。
这需要区分对 `foo.y` 的访问(access)和修改(mutation),可能并不简单,但看起来也不是特别复杂。
我想知道这里是否存在某些隐藏的坑,会让它从语言设计角度变得复杂得多,或者用起来不如我设想的那么顺手。如果没有的话,这似乎就是未来语言可以实现的一个很直接的特性,我认为值得为它增加一个关键字。
如果这是可行且理想的,那么默认值应该是什么?如果三种状态都存在的话,把只读作为默认值,似乎比完全私有更合理一些。
很想听听大家的想法。
相似文章
@debasishg:我关于Rust底层系统设计系列的第一部分现已发布 - 这部分涵盖:• 如何根据谁接触什么来布局共享的Rust结构体…
关于Rust底层系统设计系列的第一部分介绍了缓存感知的数据布局技术,包括字段分区以避免伪共享,重点涉及多线程结构体和128字节规则,并以SPSC环形缓冲区为例。
Bun 的问题可能在于公开开发
一篇分析 Bun 实验性使用 LLM 将其 Zig 代码库转译到 Rust 所引发的争议的文章,强调公众的强烈反应源于透明的开发实践而非实验本身。
限制 trait 的可实现性与字段可变性
Rust 宣布对 RFC 3323 功能进行 nightly 测试,这些功能限制 trait 的可实现性和字段可变性,为密封 trait 模式和 getter 方法提供了直接替代方案。
rust-lang/rust 正在采用 LLM 政策
Rust 项目正在采用一项新政策,规范在向 rust-lang/rust 单一代码库贡献时如何使用 LLM,为 PR 作者、审查者和问题报告者制定正式规则。
在Rust中的缓存感知数据布局:字段分区、伪共享与128字节规则
这篇博客文章解释了Rust中针对多线程结构的缓存感知数据布局,涵盖了字段分区和避免伪共享的128字节规则,并以一个SPSC环形缓冲区为例。