< 返回版块

Borber 发表于 2021-12-21 12:44

Tags:字符串

大佬们, 这样的两个函数可以合并成一个吗?

pub fn rs_error (e: &str) -> DaMieError {
    DaMieError::RunSomethingError(String::from(e))
}

pub fn rs_error_s(s: String) -> DaMieError{
    DaMieError::RunSomethingError(s)
}

评论区

写评论
苦瓜小仔 2021-12-24 00:19

这是另一种解决方法:把 &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

laris 2021-12-23 22:03
作者 Borber 2021-12-21 13:03

赞! 大佬太强了就是这样 感谢

--
👇
苦瓜小仔: ```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")); }

苦瓜小仔 2021-12-21 12:59
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"));
}
1 共 4 条评论, 1 页