被 Rust 的子类型和方差所蒙蔽

  • 主要内容:介绍了在 Rust 中处理类型相关问题的过程,包括将标准库类型替换为自定义类型时出现的编译错误,以及对“Subtyping and Variance”概念的探索和解决方法。
  • 关键信息

    • 在 Rust 插件系统系列中,将 Tremor 的类型与 FFI 兼容时遇到问题,如使用abi_stable crate 替换std类型后出现大量编译错误,其中 70 个与生命周期有关。
    • 发现Cow<'a>RCow在比较时出现生命周期不匹配错误,虽能通过引入新的生命周期参数'b修复部分PartialEq相关的错误,但Ord相关的错误无法解决。
    • 在 Rust Discord 服务器的帮助下,了解到“Subtyping and Variance”概念,RCowCow的差异在于BorrowOwned<'a> trait,RCow是不变的,而Cow是协变的,需要使RCow协变才能解决问题。
    • 尝试了多种方法来解决问题,如使用 GATs、transmute和摆脱BorrowOwned<'a>,最终通过引入新的泛型参数O,消除BorrowOwned trait,使类型协变,解决了编译错误。
  • 重要细节

    • Cow<'a>用于在运行时持有借用或拥有的值,以提高性能。
    • 介绍了一些关于“Subtyping and Variance”的资源,如 The Rustonomicon、The Rust Reference 和 Wikipedia 等。
    • 详细描述了各种尝试解决问题的方法及其遇到的困难,如 GATs 无法使类型协变,transmute存在安全隐患等。
    • 提到了abi_stable crate 的作者 Rodri 提出的修复方案,并给出了简化版本的代码。
    • 指出 Rust 1.62.0 开始在错误消息中提供相关文档,但理解整个主题仍然困难。
阅读 11
0 条评论