gpt4 book ai didi

rust - 在处理嵌套的选项类型时,如何减少代码的嵌套?

转载 作者:行者123 更新时间:2023-11-29 08:05:24 25 4
gpt4 key购买 nike

我是 Rust 的新手,我想减少代码的嵌套。以此 C# 代码为例:

for (int i = 0; i < 100; i++)
{
var obj = arr[i];
if (obj != null)
{
var something = obj.Something;
if (something == null)
{
if (i % 3 == 0)
Console.WriteLine(i);
break;
}
}
}

ReSharper 建议重写它以减少嵌套:

for (int i = 0; i < 100; i++)
{
var obj = arr[i];
if (obj == null)
continue;
var something = obj.Something;
if (something != null)
continue;
if (i % 3 == 0)
Console.WriteLine(i);
break;
}

有没有办法在 Rust 中做同样的事情?如果我嵌套了 Option<Option<Option<T>>>等等我应该这样写:

fn main() {
for i in 1..100 {

if let Some(data) = some_data::get_some_data() {
if let Some(result) = data.some_work(i) {
if result > 80 {
break;
}
}
}

println!("{}", i);
}
}

mod some_data
{
pub struct SomeData {
value : i32
}

impl SomeData {
pub fn some_work(&self, i : i32) -> Option<i32> {
Some(self.value + i)
}
}

pub fn get_some_data() -> Option<SomeData> {
Some(SomeData { value : 50 })
}
}

这个例子被简化了,但它显示了核心问题。

最佳答案

您可以做一些事情。一种选择是在 None 臂中使用匹配和 continue,类似于您的 C# 代码:

fn main() {
for i in 1..100 {

let data = match some_data::get_some_data() {
None => continue,
Some(data) => data
};
let result = match data.some_work(i) {
None => continue,
Some(result) => result
};

if result > 80 {
break;
}

println!("{}", i);
}
}

正如@Cecilio Pardo 所建议的,您可以做的另一件事是使用 Option 类型的 is_then 方法来链接您的操作:

fn main() {
for i in 1..100 {

if let Some(result) = some_data::get_some_data()
.and_then(|data| data.some_work(i)) {
if result > 80 {
break;
}
}
}
}

关于rust - 在处理嵌套的选项类型时,如何减少代码的嵌套?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35094649/

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