更改返回Result的函数的返回类型

时间:2015-09-25 18:58:47

标签: rust return-value

我有一个包含函数sys_info::hostname的包,它返回主机名。唯一的问题是hostname returns Result<String, Error>,但我需要另一个必须具有返回类型Result<(), String>的函数。如何调用sys_info::hostname并在不返回相同类型的函数中返回主机名?在您提出要求之前,由于格式问题,无法更改第二个函数的返回类型。

3 个答案:

答案 0 :(得分:0)

如果结果类型不兼容,请使用try!语句来取消match的返回值,而不是使用sys_info::hostname宏。做你需要的部分。 Example

struct Error;

fn thing_returning_result(succeed: bool) -> Result<String, Error> {
    if succeed {
        Ok("Hello".into())
    } else {
        Err(Error)
    }
}

fn thing_returning_other_result(succeed: bool) -> Result<(), String> {
    match thing_returning_result(succeed) {
        Ok(s) => Err(s),
        Err(_) => Err("whoopsies".into())
    }
}

fn main() {
    println!("{:?}", thing_returning_other_result(false));
}

答案 1 :(得分:0)

我使用mapmap_err

struct Error;

fn inner() -> Result<String, Error> {
    Err(Error)
}

fn outer() -> Result<(), String> {
    inner()
        .map(|ok_val| ())
        .map_err(|err_val| "Something".to_string())
}

fn main() {
    outer();
}

答案 2 :(得分:0)

这是一个例子:

第一次尝试:

fn is_url(val: &str) -> Result<(), String> {
    match Url::parse(val) {
        Ok(_) => Ok(()),
        Err(_) => Err(format!("The URL '{}' is an invalid URL.", val)),
    }
}

更简洁:

fn is_url(val: &str) -> Result<(), String> {
    Url::parse(val).map_err(|_| format!("The URL '{}' is an invalid URL.", val))?;
    Ok(())
}