【问题标题】:What are reasons for FromStr trait not exposing lifetime?FromStr 特征不暴露寿命的原因是什么?
【发布时间】: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 没有暴露生命周期有什么特别的原因吗?也许我对生命有误解,暴露生命有弊端?

【问题讨论】:

    标签: rust traits lifetime


    【解决方案1】:

    包含生命周期会使特征更加复杂,更具体地说,会使使用该特征的通用代码更加冗长(携带不需要的生命周期)。 fn foo&lt;T: FromStr&gt;no longer work

    对于字符串的预期用途也没有必要。通常你从一个字符串 parse 并使用结果而不用担心字符串。以这种方式编写代码当然更容易。无论如何,许多类型都不需要生命周期(请参阅实现它的类型的长列表)。

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

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

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

    【讨论】:

    • 非常感谢您的回答!我真的很怀念如果暴露了生命周期,trait 就不能轻易地用作类型参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 2021-11-23
    • 2022-01-18
    • 2017-12-10
    • 2013-08-14
    • 2017-06-03
    • 2023-02-23
    相关资源
    最近更新 更多