当选项为None时如何有条件地执行代码?

81

如果函数返回一个可选值,我不想采取任何行动;如何仅测试None情况? 这段代码可以运行,但看起来很糟糕。

let v = ffunc();
match v {
  None => { callproc() }, 
  Some(x) => {  }
}

在 C 语言中,我可以这样写:

int x = ffunc();
if ( !x ) { callproc() } 

也许你想使用 https://doc.rust-lang.org/std/result/enum.Result.html#method.or_else - Stargateur
如果以下任何一个答案解决了您的问题,您应该接受它(单击适当答案旁边的勾选标志)。这样做有两个作用:一是让每个人知道您的问题已得到满意地解决,二是给予帮助您的人功劳。详细说明请参见此处 - hellow
4个回答

76

63

要检查一个Option是否为None,可以使用Option::is_none或使用if let语法。

例如:

let x = ffunc();

if let None = x {
    println!("x is None")
}

或者使用 Option::is_none 函数:

let x = ffunc();

if x.is_none() {
    println!("x is None")
}

7
或者 if x == None - Shepmaster
6
仅当 Option<T> 中的 T 实现了 PartialEq 时才成立。 - hellow

31
为了回答上面的问题,如果选项是Some(x),请执行以下操作:
let v = ffunc()
if let Some(x) = v {
    func_to_use_x(x);
} else {
    callproc();
}
如果您不在意选项中的值,那么:
if v.is_none() {...}
或者
if v.is_some() {...}

5

如果您想在 Option 的值为 None 时插入一个值,并在否则情况下获取该值,您可以使用 get_or_insert

let mut x = None;
let y = x.get_or_insert(5);

assert_eq!(y, &5);
assert_eq!(x, Some(5));

或者使用 get_or_insert_with 进行延迟评估:

let mut x = None;
let y = x.get_or_insert_with(|| 5);

assert_eq!(y, &5);
assert_eq!(x, Some(5));

您也可以使用oror_else返回一个新的Option,而不是改变原始值:

let x = None;
assert_eq!(x.or(Some(100)), Some(100));

let x = None;
assert_eq!(x.or_else(|| Some(100)), Some(100));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接