【问题标题】:Rust's drain, iterator dropped ... "removes any remaining elements"Rust 的流失,迭代器被丢弃......“删除任何剩余的元素”
【发布时间】:2020-02-04 08:33:28
【问题描述】:

在Programming Rust的第327页上,您可以找到以下声明

然而,与 into_iter() 方法不同,它通过值获取集合并使用它,drain 只是借用了对集合的可变引用,当迭代器被删除时,它会删除集合中的任何剩余元素,并将其留空。

我很困惑它说它从集合中删除任何 剩余 元素是什么意思?当迭代器被删除时,我可以通过这段代码看到 a 中的剩余元素仍然存在,

fn main() {
    let mut a = vec![1, 2, 3, 4, 5];
    {
        let b: Vec<i32> = a.drain(0..3).collect();
    }

    println!("Hello, world! {:?}", a);
}

也许我只是对措辞感到困惑。还有其他的吗?

【问题讨论】:

  • 没有一个单一的drain 方法,而是针对多种集合使用单独的方法,例如Vec&lt;T&gt;、HashMap&lt;K, V&gt; 和 String。 Programming Rust 是说它在谈论哪一个,还是模棱两可? HashSet::drain 完全按照文字所说的那样做。

标签: rust iterator


【解决方案1】:

这看起来有点不准确。

这句话的真正含义是:如果你删除 drain 迭代器而不用尽它,它将删除所有用于创建它的元素。正如您要求它只使用前三个元素,它不会清空整个向量,而是只清空第一部分;但即使未使用它也会这样做:

fn main() {
    let mut a = vec![1, 2, 3, 4, 5];
    {
        let _ = a.drain(0..3);
    }

    println!("Hello, world! {:?}", a);
}
Hello, world! [4, 5]

playground

您可以这样理解:这里提到的“集合”不是调用drain 的初始集合,而是由传递的范围指定的“子集合”。

【讨论】:

    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2015-05-23
    • 2016-06-24
    • 1970-01-01
    相关资源
    最近更新 更多