其他分享
首页 > 其他分享> > rust 错误处理

rust 错误处理

作者:互联网

rust 的错误处理十分优雅,没有 try-catch,也没有像是 go 一样的 if err != nil {...}
rust 的错误处理是函数式的,使用起来十分流畅,其应对错误处理的方式也有很多

rust 通过枚举 Result<T, E> 来进行错误处理,而对于不应该发生错误的地方,rust 提供了 Option<T> 枚举供我们使用

pub enum Result<T, E> {
    Ok(T),
    Err(E),
}

pub enum Option<T> {
    None,
    Some(T),
}

这里只说 rust 的 Result<T, E>

impl<T, E> Result<T, E> {
	// 当 Result 枚举的值是 Ok 的时候返回 true
	// 可用于只关注状态而不关注 Ok(T) 中的值的时候使用
	pub const fn is_ok(&self) -> bool {}

	// 当 Result 的值是 Err(E) 的时候返回 true
	pub const fn is_err(&self) -> bool {}

	// 返回 Ok(T) 中的值,并且消费掉 Result 本身
	// 如果 Result 的值是 Err 将会 panic,并将 msg
	// 作为信息输出
	pub fn expect(self, msg: &str) -> T {}

	// 是 Ok 就将值取出,并消费掉 Result,如果是 Err,
	// 就会 panic,与 expect 相比不能自定义信息
	// unwrap 方法十分形象,“把 Ok(T) 解包,取出里面的值”
	pub fn unwrap(self) -> T {}

	// 如果返回值是 Ok(T) 就解包,如果不是就将自己设置的
	// 默认值 default 返回
	pub fn unwrap_or(self, default: T) -> T {}

	// 如果是 Ok(T) 就解包(这个`解包`的说法不一定正确,只是
	// 我觉得比较好理解而已,没有什么好纠结的)
	// 如果不是 Ok(T) 即返回的是 Err(E),那就将 Err(E) 中的
	// 值取出来,交给闭包进行计算,返回值类型应该与 Ok(T)
	// 中的 T 一致
	pub fn unwrap_or_else<F>(self, op: F) -> T {}
	// where F: FnOnce(E) -> T {}
}

unwrap_or_else 举个例子

fn main() {
    let ok = get_ok_result().unwrap_or_else(|err| -> String {
        format!("{}", err)
    });

    let err = get_err_result().unwrap_or_else(|err| -> String {
        format!("{}", err)
    });

    println!("{}",ok);
    println!("{}",err);
}

fn get_ok_result() -> Result<String, String> {
    Ok("everything is working very well".to_owned())
}

fn get_err_result() -> Result<String, String> {
    Err("error happend here".to_owned())
}

结果:

everything is working very well
error happend here

To be continued...

标签:Ok,rust,err,Err,pub,Result,错误处理,fn
来源: https://www.cnblogs.com/slime04/p/16348479.html