使用 drain(.) 来保留原始结构的内存分配的唯一原因是什么?



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

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

为什么需要耗尽整个序列?我可以看到这个记录在案,但我没有看到任何用例,

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

如果排水不占所有权,而是清除原始结构,那么不拥有所有权又有什么意义呢?我认为可变引用的意义是因为"书是借来的">,你可以把它还给它。如果原始结构被清除,为什么不"拥有">这本书呢?你为什么只想借一些东西并摧毁它?想要借用一个向量的子集,并清除该子集是有道理的——但我似乎无法绕开想要借用整个东西来清除原始结构。

我认为你从错误的方向接近这个问题。

做出决定后,您希望拥有一种RangeBoundsdrain方法,然后您需要考虑不允许无界RangeBounds的利弊。

优点

  • 如果您不允许无界范围,那么关于是否使用drain(..)into_iter()的混淆就会减少,尽管请注意这两者并不完全相同。

缺点

  • 您实际上必须不遗余力地禁止无限范围。

  • 理想情况下,您希望使用无限范围会导致编译错误。我是 Rust 的新手,所以我不确定这一点,但据我所知,没有办法表达drain应该采用实现特征RangeBounds的泛型,只要它不是RangeFull

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

  • 正如在注释和建议的副本中所观察到的,在完全耗尽它之后,Vec的长度将为 0,但容量与调用drain之前相同。通过允许无限的drain范围,您可以更轻松地避免在某些用例中重复分配内存。

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

最新更新