gpt4 book ai didi

rust - 是否有一种简单的方法来链接返回选项值的函数的结果?

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

我有一些看起来像这样的代码:

f(a).and_then(|b| {
g(b).and_then(|c| {
h(c).map(|d| {
do_something_with(a, b, c, d)
})
})
})

其中 fgh 返回 Option 值。我需要在 中使用所有中间值(abcd) >do_something_with 计算。压痕很深。有一个更好的方法吗?理想情况下它看起来像这样(当然行不通):

try {
let b = f(a);
let c = g(b);
let d = h(c);
do_something_with(a, b, c, d)
} rescue NonexistentValueException {
None
}

最佳答案

Rust 1.22

question mark operator现在支持 Option,因此您可以将函数编写为

fn do_something(a: i32) -> Option<i32> {
let b = f(a)?;
let c = g(b)?;
let d = h(c)?;
do_something_with(a, b, c, d) // wrap in Some(...) if this doesn't return an Option
}

使用rust 1.0

Rust 标准库定义了一个 try! 宏(以及等效的 ? 运算符,自 Rust 1.13 开始)解决了 Result 的这个问题。宏看起来像这样:

macro_rules! try {
($expr:expr) => (match $expr {
$crate::result::Result::Ok(val) => val,
$crate::result::Result::Err(err) => {
return $crate::result::Result::Err($crate::convert::From::from(err))
}
})
}

如果参数是Err,它会从函数返回Err 值。否则,它的计算结果为包装在 Ok 中的值。该宏只能在返回 Result 的函数中使用,因为它会返回遇到的错误。

我们可以为 Option 制作一个类似的宏:

macro_rules! try_opt {
($expr:expr) => (match $expr {
::std::option::Option::Some(val) => val,
::std::option::Option::None => return None
})
}

然后您可以像这样使用这个宏:

fn do_something(a: i32) -> Option<i32> {
let b = try_opt!(f(a));
let c = try_opt!(g(b));
let d = try_opt!(h(c));
do_something_with(a, b, c, d) // wrap in Some(...) if this doesn't return an Option
}

关于rust - 是否有一种简单的方法来链接返回选项值的函数的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31172451/

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