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