rust 有没有更简洁的方法来格式化.expect()消息?

epfja78i  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(115)

我现在必须使用这个来格式化.expect()消息:

fn main() {
    let x: Option<&str> = None;
    x.expect(&format!("the world is ending: {}", "foo")[..]);
}

字符串
有没有不那么冗长的方法?

3gtaxfhh

3gtaxfhh1#

我会做:

option.unwrap_or_else(|| panic!("ah: {}", "nuts"))

字符串
这是针对Option的,对于Result,你需要忽略参数:

result.unwrap_or_else(|_| panic!("ah: {}", "nuts"))


格式化字符串的代价有点大。这将避免格式化字符串,除非它确实需要。

ne5o7dgx

ne5o7dgx2#

首先,你不需要写[..]
如果你真的想恐慌,但也想格式化错误消息,我想我会使用assert!()

fn main() {
    let x: Option<&str> = None;
    assert!(x.is_some(), "the world is ending: {}", "foo");
    let _x = x.unwrap();
}

字符串
如果你愿意,你也可以使用unwrap crate:

use unwrap::unwrap;

fn main() {
    let x: Option<&str> = None;
    let _x = unwrap!(x, "the world is ending: {}", "foo");
}


此外,这两种方法每次都避免了错误String的构造,而不像用format!()调用expect()

jhkqcmku

jhkqcmku3#

为了避免在Ok的情况下格式化和分配String的不必要开销,您可以将Option转换为Result,然后展开它:

fn main() {
    let x: Option<&str> = None;
    x.ok_or_else(|| format!("the world is ending: {}", "foo"))
        .unwrap();
}

字符串

相关问题