gpt4 book ai didi

Rust 在 while let 中堆叠可选

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

我真的是 Rust 的新手,在进行 ruSTLings 练习时,我发现了一些关于堆叠选项我不完全理解的东西。

给定以下代码:

let vector = vec![Some(24), None, Some(42)];
let mut iter = vector.iter();
while let Some(Some(number)) = iter.next() {
println!("Number: {}", number);
}

我希望看到以下输出:

Number: 24
Number: 42

但我想一旦 rust 遇到 None,while 循环就会退出,只打印 24

迭代和解包可选值的最惯用的 Rust 代码是什么?我得到的最接近的看起来像这样:

let mut iter = vector.iter();
while let Some(iterNext) = iter.next() {
if let Some(num) = iterNext {
println!("Number: {}", num);
}
}

或者也可以通过在 for 循环中检查是否存在来完成:

for opt in &vector {
if opt.is_some() {
println!("Number: {}", opt.unwrap());
}
}

最佳答案

另一种编写这段代码的好方法是

for num in vector.iter().flatten() {
println!("{}", num);
}

迭代器上的 flatten() 方法将迭代器的每个项目视为一个迭代器,并返回一个包含所有这些链接在一起的迭代器的迭代器。 Option 是一个迭代器,如果它是 Some 则产生一个元素,如果 None 则不产生一个元素,所以 flatten()这正是我们想要的。

当然,您也可以使用 for_each() 编写此代码,但对于有副作用的代码,我通常更喜欢 for 循环。

关于Rust 在 while let 中堆叠可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63617559/

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