gpt4 book ai didi

rust - 防 rust 不可变

转载 作者:行者123 更新时间:2023-12-03 11:33:14 28 4
gpt4 key购买 nike

我是python的新手,并且在python中广泛使用了功能样式。

我正在尝试做的是接收一个字符串(切片)(或任何可迭代的)并使用对当前索引和下一个索引的引用进行迭代。这是我的尝试:

fn main() {
// intentionally immutable, this should not change
let x = "this is a
multiline string
with more
then 3 lines.";

// initialize multiple (mutable) iterators over the slice
let mut lineiter = x.chars();
let mut afteriter = x.chars();
// to have some reason to do this
afteriter.skip(1);

// zip them together, comparing the current line with the next line
let mut zipped = lineiter.zip(afteriter);

for (char1, char2) in zipped {
println!("{:?} {:?}", char1, char2);
}
}

我认为应该有可能获得不同的迭代器,这些迭代器在切片中具有不同的位置,但无需复制字符串即可引用内存的相同部分,但是我得到的错误如下:
error[E0382]: use of moved value: `afteriter`
--> /home/alex/Documents/projects/simple-game-solver/src/src.rs:15:35
|
10 | let afteriter = x.chars();
| --------- move occurs because `afteriter` has type `std::str::Chars<'_>`, which does not implement the `Copy` trait
11 | // to have some reason to do this
12 | afteriter.skip(1);
| --------- value moved here
...
15 | let mut zipped = lineiter.zip(afteriter);
| ^^^^^^^^^ value used here after move

我还会收到一条警告,告诉我 zipper 不需要是易变的。

是否可以在单个变量上实例化多个迭代器,如果可以,该如何完成?

最佳答案

Is it possible to instantiate multiple iterators over a single variable and if so how can it be done?


如果您检查 Iterator::skip的签名和文档:
fn skip(self, n: usize) -> Skip<Self>

Creates an iterator that skips the first n elements.

After they have been consumed, the rest of the elements are yielded. Rather than overriding this method directly, instead override the nth method.


您可以看到它按值接受 self(使用输入迭代器)并返回一个新的迭代器。这不是就地使用迭代器的前 n元素的方法,而是一种将现有迭代器转换为跳过前n个元素的迭代器的方法。
因此,而不是:
let mut afteriter = x.chars();
afteriter.skip(1);
你只要写:
let mut afteriter = x.chars().skip(1);

I also get a warning telling me that zipped does not need to be mutable.


这是因为Rust的 for循环使用了 IntoIterator特性,该特性将可迭代对象移动到了循环中。它不是在创建可变的引用,而只是在消耗RHS。
因此,它不在乎变量的可变性。如果您显式地进行迭代,或者调用其他“终端”方法(例如 mutnthtry_fold),或者您想对可变引用进行迭代(这对集合最有用),则确实需要 all,但不是将迭代器移交给其他组合器方法或 for循环。
如果愿意,for循环将使用 selfJust as for_each does in fact

关于rust - 防 rust 不可变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62057514/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com