使用Drain(..)保留原始结构的内存分配的唯一原因是吗?

时间:2019-10-07 02:45:07

标签: rust iterator

Rust具有耗尽整个序列的功能,

  

如果确实需要耗尽整个序列,请使用整个范围..作为参数。 -编程Rust

您为什么需要耗尽整个序列? I can see this documented,但我看不到任何用例,

let mut drain = vec.drain(..);

如果流失并没有取得所有权而是清除了原始结构,那么不取得所有权有什么意义呢?我认为可变参考的目的是因为“这本书是借来的” ,您可以将其还给我。如果清除了原始结构,为什么不“拥有” 这本书?您为什么只想借东西并销毁它?想要borrow a subset of a vector, and clearing that subset很有道理-但我似乎无法全神贯注地想要借用整个东西来清除原始结构。

1 个答案:

答案 0 :(得分:0)

我认为您是从错误的方向来解决这个问题。

已经决定要使用drain的{​​{1}}方法,然后需要考虑禁止无限制RangeBounds的利弊。

专业人士

  • 如果您禁止无限制范围,则尽管使用了RangeBoundsdrain(..),但不会混淆,尽管这两个并不完全相同。

缺点

  • 实际上,您必须竭尽所能禁止无限范围。

  • 理想情况下,您希望使用无限范围引起编译错误。我是Rust的新手,所以我不确定,但是据我所知,没有办法表示into_iter()应该采用实现特征drain的泛型,只要它不是RangeBounds

  • 如果在编译时无法检查,那么在运行时您想要什么行为?恐慌似乎是唯一的选择。

  • 如注释和建议的重复项所述,完全耗尽后,RangeFull的长度为0,但容量与调用Vec之前的容量相同。通过在drain中使用无限制范围,您可以更轻松地避免在某些情况下重复分配内存。

至少对我来说,弊大于利。