为带有生命周期标注的 struct 实现 trait 的问题

问题描述

问题来自于Rust中文社区,链接:https://rust.cc/article?id=c8c9e40a-b27c-4... ,错误代码如下:

use std::str::FromStr;

pub struct Wrapper<'a>(&'a str);

impl FromStr for Wrapper<'_> {
    type Err = ();

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        Ok(Wrapper(s))
    }
}

原因分析

在《Rust程序设计语言》中第10.3节中,讲到 “编译器采用三条规则来判断引用何时不需要明确的注解。第一条规则适用于输入生命周期,后两条规则适用于输出生命周期。如果编译器检查完这三条规则后仍然存在没有计算出生命周期的引用,编译器将会停止并生成错误。这些规则适用于 fn 定义,以及 impl 块。
第一条规则是每一个是引用的参数都有它自己的生命周期参数。
第二条规则是如果只有一个输入生命周期参数,那么它被赋予所有输出生命周期参数:fn foo<'a>(x: &'a i32) -> &'a i32
第三条规则是如果方法有多个输入生命周期参数,不过其中之一因为方法的缘故为 &self 或 &mut self,那么 self 的生命周期被赋给所有输出生命周期参数。第三条规则使得方法更容易读写,因为只需更少的符号。
在上述例子中,fn from_str函数显然是符合第二条规则,也就是说入参s: &str的生命周期被赋予为输出的生命周期。但是,输出参数中的Self对应的类型为结构体Wrapper,而Wrapper是有生命周期的限制的,此时编译器不知道如何判断,因此报错。
问题题主的原意是要为自定义类型实现FromStr trait,但是此处很显然是不可以的(我分析的结果是这样,如果有高手能直接在此处实现FromStr trait也请积极留言,不胜感激),可以考虑用其它的办法来实现类似的功能(如通过方法)。

本作品采用《CC 协议》,转载必须注明作者和本文链接

令狐一冲

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!