3.6.1 权限令牌
01-权限令牌 — Comprehensive Rust
2 分钟阅读
译文 · 基于 Comprehensive Rust
原文链接: https://google.github.io/comprehensive-rust/idiomatic/leveraging-the-type-system/token-types.html
带私有构造函数的类型可用作不变量的证明。
| |
动机:我们希望限制用户对功能的访问,直到他们完成特定任务。
我们可以通过结构体与模块的隐私规则,定义 API 消费者无法自行构造的类型来做到这一点。
Newtype 以类似方式使用隐私规则,限制构造,除非值在运行时保证满足不变量。
提问:这里的
proof: ()字段目的是什么?若没有
proof: (),Token将没有私有字段,用户就能任意构造Token值。演示:尝试在
main中手动构造令牌并展示编译错误。演示:从Token中去掉proof字段,展示若没有私有字段用户将如何构造Token。通过把
Token类型放在模块边界(token)之后,该模块外的用户无法自行构造该值,因为他们无权访问proof字段。API 开发者可以定义产生这些令牌的方法与函数。用户则不能。
令牌成为已满足 API 开发者对这些令牌的访问条件的证明。
提问:API 开发者可能如何意外引入绕过方式?
期望答案如「序列化实现」、其他解析/「从字符串」实现,或
Default的实现。
01-权限令牌 — Comprehensive Rust
02-带数据的令牌类型:Mutex Guard — Comprehensive Rust
03-Branded 之一:变量专用令牌 — Comprehensive Rust
04-Branded 之二:PhantomData 与生命周期子类型 — Comprehensive Rust
05-Branded 之三:实现 — Comprehensive Rust
06-Branded 之四:Branded 类型实战 — Comprehensive Rust