如何返回第一个非空字符串?

Jef*_*y04 3 rust

以下 Python 代码返回第一个非空字符串(在本例中为 的内容bar):

foo = ""
bar = "hello"
foo or bar # returns "hello"
Run Code Online (Sandbox Code Playgroud)

我如何用 Rust 编写它?我尝试过这个:

let foo = "";
let bar = "";
foo || bar;
Run Code Online (Sandbox Code Playgroud)

但我得到了这个

let foo = "";
let bar = "";
foo || bar;
Run Code Online (Sandbox Code Playgroud)

我想我不能用 Rust 轻松地完成我在 Python 中所做的事情?

mrh*_*nia 5

您还可以创建一个扩展特征来添加您想要的行为:

trait Or: Sized {
    fn or(self, other: Self) -> Self;
}

impl<'a> Or for &'a str {
    fn or(self, other: &'a str) -> &'a str {
        if self.is_empty() { other } else { self }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以像这样使用它:

assert_eq!("foo".or("bar"), "foo");
assert_eq!("".or("").or("baz").or("").or("quux"), "baz");
Run Code Online (Sandbox Code Playgroud)

如果您需要确保第二个参数被延迟计算,您可以Or使用以下方法扩展该特征:

fn or_else<F: FnOnce() -> Self>(self, f: F) -> Self;
Run Code Online (Sandbox Code Playgroud)

Option有关更多详细信息,请参阅:Option#or和的类似方法Option#or_else