我有一个函数,它接受 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
评估为其对应的类型?
答案 0 :(得分:1)
首先,重要的是要记住 Option<T>
不是 T
。即使它包含一个,它本身也不是一个。这是一个可能是空的也可能不是空的盒子。这与 Kotlin 等语言形成对比,其中 T?
实际上是 T
或可能是 null
。
除此之外,听起来您想要获取 px
和 py
,如果它们包含值,则向它们添加一个,如果它们不包含,则将它们留空.这是 map
的完美用例。
(px.map(|x| x+1u32), py.map(|x| x+1u32))
作为一般性建议,在 Java 和 Kotlin 中,您将花费大量时间使用 if 语句和命令式逻辑来确定空值。在 Rust 中,您将主要使用 Option
上的标准库方法来执行此操作。认识他们;它们真的非常有用,并且包含了许多您经常使用的模式,而在其他语言中,这些模式可能只需要通过大量的显式空检查来完成。