作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我真的是 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/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!