Rust FromStr特性是这样定义的

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不会暴露生命周期吗?也许我误解了关于终生的东西,揭露终生的缺点吗?

最佳答案

包括生命周期会使特性变得更加复杂,更具体地说,会使使用该特性的通用代码变得更加冗长(携带不必要的生命周期)。 fn foo<T: FromStr>将为no longer work

对于字符串的预期用途也没有必要。通常,您可以从字符串中进行解析,然后使用结果而不必担心该字符串。用这种方式编码当然更容易。无论如何,许多类型都不需要生存期(请参见实现它的一长串类型)。

您不能为此类型实现FromStr。你能做的是

impl<'a> From<&'a str> for MyIterator<'a> { ... }

这为您提供了许多通用转换机制,而没有str::parse()方法。也许该方法的名称是省略生命周期的另一个理由。

关于rust - FromStr特性不公开生命周期的原因是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30355949/

10-11 18:43