BorrowChecker跨文件/模块

张开发
2026/5/27 22:29:27 15 分钟阅读
BorrowChecker跨文件/模块
检测每个文件或模块最外面的公开接口签名。跨文件/模块检测是怎么工作的1.记录文件/跨模块的可见性和公开API编译器只检查函数参数、返回值参数传入转换所有权返回值输出所有权转移2.函数返回必须清楚返回的东西能存活多久生成带生命周期的标注3.调用方必须遵守公开函数参数、返回值规则借用生命周期示例//Lib.ssfunction Apply(value)// ...endf编译器看到这个函数接口会自动理解为“返回的东西其有效期不能超过传入的 value”。这是一个隐含的、最严格的条款。有如下调用//Main.ssfunction Main()s acresult Apply(s)echo result: BorrowChecker String(s): Immutable sendf编译器的跨文件/模块检测过程1.查看编译器去看Apply的定义知道要返回的东西有效期取决于传入的value。2.检查发现调用者把 result 的生命周期延长到了 s 被销毁之后。3.判定返回的东西不能比输入活得更久。4.报告编译器检测到 Main.ss 里的 s 只活到第3行但 result 在第4行还要用而 result 的有效期和 s 绑定所以不行。总结:跨文件/模块检测就是把不同函数签名拿出来检查“借用方”的行为有没有违反条款。编译器不看函数内部的具体实现只看公开的接口约定。

更多文章