Rust 如何为实用程序函数模拟varargs?

Rust 如何为实用程序函数模拟varargs?,rust,Rust,Result.expect()的控制台输出不是我需要的,所以我用自己的版本扩展了Result: trait ResultExt<T> { fn or_exit(self, message: &str) -> T; } impl<T> ResultExt<T> for ::std::result::Result<T, Error> { fn or_exit(self, message: &str) ->

Result.expect()
的控制台输出不是我需要的,所以我用自己的版本扩展了
Result

trait ResultExt<T> {
    fn or_exit(self, message: &str) -> T;
}

impl<T> ResultExt<T> for ::std::result::Result<T, Error> {
    fn or_exit(self, message: &str) -> T {
        if self.is_err() {
            io::stderr().write(format!("FATAL: {} ({})\n", message, self.err().unwrap()).as_bytes()).unwrap();
            process::exit(1);
        }
        return self.unwrap();
    }
}

与Java、Kotlin或C相比,这太冗长了。解决这个问题的首选方法是什么?

我不认为您建议的API特别不合理。如果最大性能很重要,那么将错误生成放在一个闭包中或为此提供一个API可能是有意义的,因此
字符串
仅在实际存在错误时分配,这在格式化成本特别高的情况下可能特别相关。(与所有的
\u其他
方法一样。)

但是,您可以通过定义一个包含结果、一个
&str
和格式参数的宏,使其更符合人体工程学。例如:(这是基于@E_net4的评论)

macro\u规则!或退出{
($res:expr,$fmt:expr,$($arg:tt)+)=>{
$res.unwrap_或_else(| e|{
让消息=格式!($fmt,$($arg)+);
eprintln!(“致命:{}({})\n”,信息,e);
进程::退出(1)
})
};
}
fn main(){

让x:resultm更像是旁注而不是实际答案:
resultText
的实现在这里可以得到改进,因为
是错误的,然后获取错误和/或结果值不是惯用的方法。您也可以使用
write!
宏而不是原始调用
write
。注意,您可以删除
ResultExt
trait并简单地执行
x.unwrap_或_else(| | | panic!(“啊哈!一个错误!{}”,“废话”);
这比您当前的解决方案更详细,也更明确(它清楚地表明,此
展开
结果
,而您的解决方案看起来更像
或返回
结果的\u else
)。您应该使用以避免不必要的分配。
something().or_exit(&format!("Ah-ha! An error! {}", "blah"));
macro_rules! or_exit {
    ($res:expr, $fmt:expr, $($arg:tt)+) => {
        $res.unwrap_or_else(|e| {
            let message = format!($fmt, $($arg)+);
            eprintln!("FATAL: {} ({})\n", message, e);
            process::exit(1)
        })
    };
}

fn main() {
    let x: Result<i32, &'static str> = Err("dumb user, please replace");
    let _ = or_exit!(x, "Ah-ha! An error! {}", "blahh");
}