gpt4 book ai didi

rust - 如何在 Rust 中对 'Option' 分配进行分组?

转载 作者:行者123 更新时间:2023-11-29 07:45:00 25 4
gpt4 key购买 nike

我有一段代码,其中需要一次分配多个可选变量。任何值都不太可能是 None,因此单独处理每个失败案例并不是特别有用。

目前我这样写支票:

if let Some(a) = foo_a() {
if let Some(b) = foo_b() {
if let Some(c) = foo_c() {
if let Some(d) = foo_d() {
// code
}
}
}
}

如果可以对作业进行分组会很方便。如果没有这个,添加一个新变量会使 block 缩进一级,从而产生嘈杂的差异并导致不必要的深缩进:

if let Some(a) = foo_a() &&
let Some(b) = foo_b() &&
let Some(c) = foo_c() &&
let Some(d) = foo_d()
{
// code
}

有没有办法在一个 if 语句中分配多个 Option


一些值得注意的细节:

第一个失败的函数应该短路而不调用其他函数。否则,它可以这样写:

if let (Some(a), Some(b), Some(c), Some(d)) = (foo_a(), foo_b(), foo_c(), foo_d()) {
// Code
}

使用函数可以避免深度缩进,但我不希望这样做,因为您可能不希望正文处于不同的范围内...

fn my_function(a: Foo, b: Foo, c: Foo, d: Foo) {
// code
}

if let Some(a) = foo_a() {
if let Some(b) = foo_b() {
if let Some(c) = foo_c() {
if let Some(d) = foo_d() {
my_function(a, b, c, d);
}
}
}
}

最佳答案

作为@SplittyDev said ,您可以创建一个宏来获得您想要的功能。这是一个替代的基于宏的解决方案,它也保留了短路行为:

macro_rules! iflet {
([$p:pat = $e:expr] $($rest:tt)*) => {
if let $p = $e {
iflet!($($rest)*);
}
};
($b:block) => {
$b
};
}


fn main() {
iflet!([Some(a) = foo_a()] [Some(b) = foo_b()] [Some(c) = foo_c()] {
println!("{} {} {}", a, b, c);
});
}

Playground

关于rust - 如何在 Rust 中对 'Option' 分配进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40986141/

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