仅当Option为None时,如何有条件地执行代码?

时间:2018-11-06 18:37:48

标签: rust

如果函数在可选参数中返回值,我不想采取任何措施;如何仅测试regsvr32.exe /s your.dll if %errorlevel% neq 0 regasm.exe your.dll 情况?该代码有效,但看起来很可怕。

None

在C语言中,我可以写:

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

5 个答案:

答案 0 :(得分:9)

要检查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")
}

答案 1 :(得分:3)

如果选项为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() {...}

答案 2 :(得分:0)

如果您对该值不感兴趣,请使用

if !v.is_some() { ... }

答案 3 :(得分:0)

如果你想在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));

答案 4 :(得分:-2)

在 C 中,我们会返回一个指针(指向某物),可能NULL。在 Rust 中,它会返回 sometype,而不是返回 Option<sometype> 的函数或变量。这是一个枚举,但可以是 NoneSome(sometype)。如果是前者,就好像它是“空的”一样 - 采取行动。如果是后者,您将需要调用 unwrap 来获取实际值(sometype 类型)。

示例:

fn main() {
    let maybe = maybe_get_string();
    // maybe isn't a String, but actually an Option<String>

    if maybe == None {
        println!("String is NULL");
    } else {
        let mystring = maybe.unwrap();
        println!("This is a test {}", mystring);
    }
}

为了完整起见,这里有一个可以有效返回字符串或“null”的函数。实际上,它返回一个 None 或一个 Some(String) 可以解包到一个字符串:

fn maybe_get_string() -> Option<String> {
    let n1 = 0;

    // Returns an option - either some string, or none:

    if (n1 % 2) == 0 {
        return Some(String::from("Teststring"));
    } else {
        return None;
    }
}