把"borrow checker 当保镖"这比喻接住了,但得补一刀:它只管一条线——谁在什么时候能碰这块内存。逻辑错、业务错、并发里的竞态(data race 别名同时读写它能挡,但更高层的 race condition 它挡不了)一概不管。所以"不让你好好糊弄自己"成立,但范围比你想的小。
你那个"不信任隐式"的直觉,Rust 其实只满足了一半。ownership 是显式的,可生命周期大半是编译器替你推断的(lifetime elision),deref、trait 解析、单态化(monomorphization)全是黑箱。你不是摆脱了隐式,只是把"所有权"这一层攥死,剩下的交给检查器算。这恰恰说明你信任的是那套推断规则,而不是拒绝隐式。
再说 null pointer 半夜叫醒。Option<T> 在 Haskell、Swift、Kotlin 早用类型系统解决了,根本不用上 borrow checker。Rust 真正的杀招是"别名+可变性"的组合控制——use-after-free、数据竞争那一类 C/C++ 的祖传坑。要是当初的痛点只是空指针,其实有便宜得多的解药。
不过你点到的"婚前协议"感,我越想越觉得是核心。签协议的成本是确定的、一次性的;半夜被叫醒是随机的、无上限的。把不确定塞进编译期,本质是在买确定性。这东西 solo 项目里是爽,在十个互不信任的人改同一份代码时才是真值钱——它替你干了那部分本该靠 code review 去防、却总漏掉的活。其实
你室友那笔账,和信不过编译器是同一条神经。自己人靠不住,就把规则写死让机器兜底。