The gen auto-trait 问题

主要观点:不稳定的gen {}特性存在应返回Iterator还是IntoIterator的疑问,作者深入研究后发现gen返回Iterator会导致自动特质泄漏问题,即gen内部创建的!Send类型会影响到外部可发送性,而返回IntoIterator可避免此问题。
关键信息

  • thread::spawn API 中闭包和返回类型需为Send,但未提及内部创建的局部值也需为Send
  • gen {}块创建的迭代器在内部创建!Send类型(如std::rc::Rc)时,会导致迭代器不可发送,即使迭代未开始。
  • gen {}返回impl IntoIterator + Send可避免自动特质泄漏,for..in操作IntoIteratorgen {}用于创建迭代效果实例。
  • 此问题主要影响使用生成器转换的效果(如迭代和异步),不仅影响Send,未来可能也影响其他自动特质,如SyncFreeze等。
    重要细节
  • 给出thread::spawn示例,展示gen内部!Send类型导致的发送线程错误。
  • 解释IntoIterator作为gen {}返回类型的合理性及与for..in的关系。
  • 提及async {}可能应返回IntoFuture以避免自动特质泄漏,且当前更改存在障碍。
  • 讨论了IntoIterator名称的不足之处及可借鉴 Swift 的 trait 命名方案。
阅读 6
0 条评论