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

Rust 在处理嵌套选项类型时,如何减少代码的嵌套?,rust,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

我是新手,我想减少代码的嵌套。以这个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;
        }
    }
}
for(int i=0;i<100;i++)
{
var obj=arr[i];
如果(obj!=null)
{
var某物=对象某物;
if(something==null)
{
如果(i%3==0)
控制台写入线(i);
打破
}
}
}
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;
}
for(int i=0;i<100;i++)
{
var obj=arr[i];
if(obj==null)
继续;
var某物=对象某物;
如果(某物!=null)
继续;
如果(i%3==0)
控制台写入线(i);
打破
}
有没有办法在生锈的地方做同样的事情?如果我有嵌套的
选项
等等,我应该编写如下内容:

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 })
    }
}
fn main(){
因为我在1..100{
如果让一些(数据)=一些数据::获取一些数据(){
如果让一些(结果)=数据。一些工作(i){
如果结果>80{
打破
}
}
}
println!(“{}”,i);
}
}
修改一些数据
{
pub结构SomeData{
值:i32
}
导入一些数据{
发布fn一些工作(&self,i:i32)->选项{
一些(自我价值+i)
}
}
pub fn get_some_data()->选项{
Some(SomeData{value:50})
}
}

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

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

正如@Cecilio Pardo所建议的,您可以做的另一件事是使用
选项的
is\u 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;
            }
        }
    }
}

您可以使用
选项的
和_-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;
            }
        }
    }
}