大佬们, 这样的两个函数可以合并成一个吗?
pub fn rs_error (e: &str) -> DaMieError {
DaMieError::RunSomethingError(String::from(e))
}
pub fn rs_error_s(s: String) -> DaMieError{
DaMieError::RunSomethingError(s)
}
1
共 4 条评论, 1 页
评论区
写评论这是另一种解决方法:把 &str 和 String 统一成
Cow<'_, str>
类型:#![feature(cow_is_borrowed)] use std::borrow::Cow; fn rs_error<'a>(s: impl Into<Cow<'a, str>>) -> DaMieError<'a> { let s = s.into(); dbg!(s.is_borrowed()); DaMieError::RunSomethingError(s) } enum DaMieError<'a> { RunSomethingError(Cow<'a, str>), } fn main() { rs_error("e"); rs_error(String::from("e")); }
但是,一般不对含生命周期参数的类型实现 Error trait。
比如
anyhow::Error
的很多方法都要求'static
,如果你定义的 Error type 有显示生命周期'a
,这意味着它就无法让调用者在使用anyhow
这样流行的错误处理库时,把 DaMieError 转成统一的 anyhow::Error 类型。--
👇
laris: From &str to Cow
From &str to Cow
赞! 大佬太强了就是这样 感谢
--
👇
苦瓜小仔: ```RUST fn rs_error(s: impl Into) -> DaMieError{ DaMieError::RunSomethingError(s.into()) }
enum DaMieError{RunSomethingError(String)}
fn main() { rs_error("e"); rs_error(String::from("e")); }
fn rs_error(s: impl Into<String>) -> DaMieError{ DaMieError::RunSomethingError(s.into()) } enum DaMieError{RunSomethingError(String)} fn main() { rs_error("e"); rs_error(String::from("e")); }