【发布时间】:2015-08-02 01:42:28
【问题描述】:
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?,但最佳答案以“我不相信你可以实现”开头,所以我想确定这在 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 没有暴露生命周期有什么特别的原因吗?也许我对生命有误解,暴露生命有弊端?
【问题讨论】: