假设我正在编写一个函数来修剪 &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/