主要观点:不稳定的gen {}
特性存在应返回Iterator
还是IntoIterator
的疑问,作者深入研究后发现gen
返回Iterator
会导致自动特质泄漏问题,即gen
内部创建的!Send
类型会影响到外部可发送性,而返回IntoIterator
可避免此问题。
关键信息:
thread::spawn
API 中闭包和返回类型需为Send
,但未提及内部创建的局部值也需为Send
。gen {}
块创建的迭代器在内部创建!Send
类型(如std::rc::Rc
)时,会导致迭代器不可发送,即使迭代未开始。- 让
gen {}
返回impl IntoIterator + Send
可避免自动特质泄漏,for..in
操作IntoIterator
,gen {}
用于创建迭代效果实例。 - 此问题主要影响使用生成器转换的效果(如迭代和异步),不仅影响
Send
,未来可能也影响其他自动特质,如Sync
、Freeze
等。
重要细节: - 给出
thread::spawn
示例,展示gen
内部!Send
类型导致的发送线程错误。 - 解释
IntoIterator
作为gen {}
返回类型的合理性及与for..in
的关系。 - 提及
async {}
可能应返回IntoFuture
以避免自动特质泄漏,且当前更改存在障碍。 - 讨论了
IntoIterator
名称的不足之处及可借鉴 Swift 的 trait 命名方案。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。