地图键和生命周期

主要观点:作者在使用 Rust 的 HashMap 和 lifetimes 时遇到奇怪的复杂性问题,通过多种方式尝试解决但仍存在困惑。
关键信息:

  • HashMap 跟踪 HTTP 请求统计时遇到问题,如在 HostStats 结构中查找主机时的生命周期限制。
  • 尝试用 HostRef 类型但无法实现 Borrow trait,Cow 几乎可行但 get 签名中存在生命周期问题。
  • 编写 try_record 方法时代码无法编译,存在 error[E0521]: borrowed data escapes outside of method 错误。
  • 最终通过绕过问题解决,如使用 hashbrown 库的 Equivalent trait 或直接使用其 raw entry API。
  • Andrew Werner 给出一种很好的定义键类型的方式,通过将 Host 拆分为 HostKeyHost 来解决 Borrow 问题。
    重要细节:
  • HostStats 结构中,get 方法需要处理不同的生命周期,record 方法处理拥有的主机名时生命周期推断工作正常。
  • 在使用 Cow 时,插入和获取键时代码可以编译,但 get 签名中的生命周期处理存在困惑。
  • try_record 方法中的额外复杂性导致编译器错误,具体原因未明确。
  • hashbrown 库提供了两种解决办法,get 基于 Equivalent trait,还有 raw entry API。
阅读 8
0 条评论