关于主张的更多想法 • 小步骤

这是一系列后续帖子中的第一篇,主要围绕对“Claiming, auto and otherwise”的设计进行澄清和调整。

  • TL;DR:人们喜欢它:人们喜欢使处理引用计数或可廉价克隆数据更便捷的想法,很多人表达了兴奋之情,可阅读Conclusion以更好理解。
  • 澄清特质的关系:用维恩图展示Copy/Clone/Claim特质的关系,Clone最通用,Copy代表可通过memcpy复制且无析构函数的“普通旧数据”,Claim代表克隆廉价、无错且透明的值,二者有重叠但无严格层级关系。
  • 关于启发式Claim特质的实现涉及一些启发式问题,如“什么是廉价?”“什么是无错?”“什么是透明?”等,当前的copy/clone分割就是因难以确定界限而产生,“廉价、无错、透明”虽不精确但代表了自动声明时的理想标准,Claim不应作为函数的绑定。
  • “无错”应改为“不展开”:原定义中“无错”意为“不能恐慌或中止”,但标准库中的ArcRc在引用计数超过std::usize::MAX时会中止,因此“无错”应改为“声明操作不应恐慌”,且若自动claim操作展开应让编译器插入中止。
  • 澄清claim代码生成:编译器在已知被声明类型实现Copy时,在单态化时仍使用memcpy,通过if impl表达式实现更优化的代码生成,定义use_claim_value函数来控制claim的代码插入。
  • 结论:提议改变 Rust 中“按值使用某物”的含义,若SomeType: Claimx被“声明”可继续使用,否则被“移动”,“声明”大致相当于调用x.claim(),实际更高效,此改变旨在保留 Rust 的一致性并弥补当前规则的不足。同时提到可将[RFC #3288]扩展到编译器自动调用的所有操作,以及 specialization 虽有“空头支票”声誉但仍值得添加。
阅读 14
0 条评论