可选参数/空处理

时间:2021-07-06 18:17:15

标签: rust

我有一个函数,它接受 4 个可为空的 BigUint 参数并返回一个 Option 类型的元组。我以迭代方式调用此函数,并且我试图弄清楚如何处理 None 值,因为我想明确地对待它们。我有以下无法编译的代码:

use num_bigint::BigUint; // 0.4.0

fn add_one(
    px: &Option<BigUint>,
    py: &Option<BigUint>,
    qx: &Option<BigUint>,
    qy: &Option<BigUint>,
) -> (Option<BigUint>, Option<BigUint>) {
    if px.is_none() && py.is_none() {
        (*qx, *qy)
    } else if px == qx {
        (None, None)
    } else {
        (px + 1u32, py + 1u32)
    }
}

出现错误:

error[E0369]: cannot add `u32` to `&Option<BigUint>`
  --> src/lib.rs:14:13
   |
14 |         (px + 1u32, py + 1u32)
   |          -- ^ ---- u32
   |          |
   |          &Option<BigUint>

error[E0369]: cannot add `u32` to `&Option<BigUint>`
  --> src/lib.rs:14:24
   |
14 |         (px + 1u32, py + 1u32)
   |                     -- ^ ---- u32
   |                     |
   |                     &Option<BigUint>

如何将 Option 评估为其对应的类型?

1 个答案:

答案 0 :(得分:1)

首先,重要的是要记住 Option<T> 不是 T。即使它包含一个,它本身也不是一个。这是一个可能是空的也可能不是空的盒子。这与 Kotlin 等语言形成对比,其中 T? 实际上是 T 或可能是 null

除此之外,听起来您想要获取 pxpy,如果它们包含值,则向它们添加一个,如果它们不包含,则将它们留空.这是 map 的完美用例。

(px.map(|x| x+1u32), py.map(|x| x+1u32))

作为一般性建议,在 Java 和 Kotlin 中,您将花费大量时间使用 if 语句和命令式逻辑来确定空值。在 Rust 中,您将主要使用 Option 上的标准库方法来执行此操作。认识他们;它们真的非常有用,并且包含了许多您经常使用的模式,而在其他语言中,这些模式可能只需要通过大量的显式空检查来完成。