Rust FromStr trait定义如下
pub trait FromStr {
type Err;
fn from_str(s: &str) -> Result<Self, Self::Err>;
}
它没有命名它的生命周期,并且无法为包含对源字符串的引用的内容实现该特征,例如:
struct MyIterator<'a> {
cur_pointer: &'a str
}
impl<'a> FromStr for MyIterator<'a> {
type Err = i32;
fn from_str(s: &'a str) -> Result<Self, Self::Err> {
Ok(MyIterator { cur_pointer: s })
}
}
给出错误
method `from_str` has an incompatible type for trait: expected bound lifetime parameter , found concrete lifetime [E0053]
到目前为止,我发现没有办法为MyIterator实现FromStr。我认为这是因为原始特征没有在其参数中暴露字符串的生命周期。 我的第一个问题是:我是对的,没有办法为MyIterator实现FromStr?如果我错了,有什么方法可以做到(假设MyIterator想要保持对原始字符串的引用)?
到目前为止,我只发现了这个问题:How do I implement FromStr with a concrete lifetime?,但最好的答案始于&#34;我不相信你可以实现&#34;,所以我想确定这是真的在Rust 1.0.0中不可能。
现在,如果特质定义是这样的:
trait MyFromStr<'a> {
type Err;
fn from_str(s: &'a str) -> Result<Self, Self::Err>;
}
可以为包含对原始字符串的引用但不包含对原始字符串的引用的类型实现它:
struct MyIterator<'a> {
cur_pointer: &'a str
}
impl<'a> MyFromStr<'a> for MyIterator<'a> {
type Err = i32;
fn from_str(s: &'a str) -> Result<Self, Self::Err> {
Ok(MyIterator { cur_pointer: s })
}
}
struct MyCopy {
val: String
}
impl<'a> MyFromStr<'a> for MyCopy {
type Err = i32;
fn from_str(s: &'a str) -> Result<Self, Self::Err> {
Ok(MyCopy { val: s.to_string() })
}
}
我的第二个问题是:是否有任何特殊原因,特质FromStr不会暴露生命?也许我误解了有关生命的一些事情,并且暴露生命有缺点?
答案 0 :(得分:3)
包含生命周期使得特征更复杂,更具体地说,使得使用该特征的通用代码更加冗长(携带不必要的生命周期)。 fn foo<T: FromStr>
会no longer work。
对于字符串的预期用途,它也是不必要的。通常你从字符串解析并使用结果而不用担心字符串。以这种方式编码肯定更容易。许多类型无论如何都不需要生命周期(参见实现它的类型的长列表)。
您无法为此类型实施FromStr
。你能做的是
impl<'a> From<&'a str> for MyIterator<'a> { ... }
这为您提供了许多通用转换机制,而不是方法str::parse()
。也许这种方法的名称是遗漏生命的另一个论据。