rust - 如果返回类型是通用的,我可以返回 &str 输入的切片吗?

标签 rust

假设我正在编写一个函数来修剪 &str 周围的空格然后将其解析为通用类型(这是一个简化的示例:我的实际函数是从正则表达式中获取多个捕获组)。

fn trim_and_parse<T: FromStr>(s: &str) -> T {
  s.trim().parse().unwrap()
}

例如我可以这样做

let n: u32 = trim_and_parse("  24  ");
let inner: String = trim_and_parse("  hi ");

这很好用,但是第二个正在分配一个新的 String 。如果我可以返回一部分输入,我真的很喜欢:

let inner: &str = trim_and_parse("  hi ");

这不起作用,因为 &str不是FromStr 。我可以做些什么来使这个界面正常工作,这样如果我使用例如u32作为类型参数,然后它将修剪后的字符串解析为数字,但我可以使用其他东西作为类型参数来获取原始字符串的切片?

我尝试尝试类似的东西

trait MyFromStr {
    fn from_str(s: &str) -> Self;
}

impl MyFromStr for &str {
    fn from_str(s: &str) -> Self {
        s
    }
}

得到 lifetime may not live long enough这很公平。还有其他方法可以完成这项工作吗?

最佳答案

您可以通过声明该特征具有生命周期来做到这一点:

trait MyFromStr<'a>: Sized {
    type Err;
    fn from_str(s: &'a str) -> Result<Self, Self::Err>;
}

impl<'a> MyFromStr<'a> for &'a str {
    type Err = std::convert::Infallible;
    fn from_str(s: &'a str) -> Result<Self, Self::Err> {
        Ok(s)
    }
}

impl<'a> MyFromStr<'a> for i32 {
    type Err = std::num::ParseIntError;
    fn from_str(s: &'a str) -> Result<Self, Self::Err> {
        s.parse()
    }
}

fn trim_and_parse<'a, T: MyFromStr<'a>>(s: &'a str) -> T
where
    T::Err: std::fmt::Debug,
{
    MyFromStr::from_str(s.trim()).unwrap()
}

关于rust - 如果返回类型是通用的,我可以返回 &str 输入的切片吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74793520/

相关文章:

macos - 从 Rust 调用动态链接的 Haskell 代码

generics - 如何从函数返回具有泛型关联类型的迭代器?

rust - 实现返回HashMap::IntoIter的IntoIterator时的“wrong number of type arguments”

rust - 如何在Rust中将变量传递给actix-web guard()?

error-handling - 将错误消息返回到期望 'Box<dyn Error>' 的函数

arrays - 如何创建超过 32 个泛型类型元素的数组 T : Default?

gcc - 使用 Cargo 构建时找不到 `lcrypto` 或 `lssl`

rust - 如果向量为空,插入值时如何避免多次可变借用向量?

dynamic - 有没有办法捕获未知的结构字段?

rust - 如何在安全的 Rust 中为非大小类型及其拥有的对应物(如 `str` 和 `String` )创建新类型?