首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

问题描述

问题来自于Rust中文社区,错误代码如下:

use std::str::FromStr;

pub struct Wrapper(&'a str);

impl FromStr for Wrapper {

type Err = ();

fn from_str(s: &str) -> Result {

Ok(Wrapper(s))

}

}

原因分析

在《Rust程序设计语言》中第10.3节中,讲到 “**编译器采用三条规则来判断引用何时不需要明确的注解。第一条规则适用于输入生命周期,后两条规则适用于输出生命周期。如果编译器检查完这三条规则后仍然存在没有计算出生命周期的引用,编译器将会停止并生成错误。这些规则适用于 fn 定义,以及 impl 块。**”

第一条规则是每一个是引用的参数都有它自己的生命周期参数。

第二条规则是如果只有一个输入生命周期参数,那么它被赋予所有输出生命周期参数:`fn foo(x: &'a i32) -> &'a i32`。

第三条规则是如果方法有多个输入生命周期参数,不过其中之一因为方法的缘故为 `&self` 或 `&mut self`,那么 `self` 的生命周期被赋给所有输出生命周期参数。第三条规则使得方法更容易读写,因为只需更少的符号。

在上述例子中,fn from_str函数显然是符合第二条规则,也就是说入参s: &str的生命周期被赋予为输出的生命周期。但是,输出参数中的Self对应的类型为结构体Wrapper,而Wrapper是有生命周期的限制的,此时编译器不知道如何判断,因此报错。

问题题主的原意是要为自定义类型实现FromStr trait,但是此处很显然是不可以的(我分析的结果是这样,如果有高手能直接在此处实现FromStr trait也请积极留言,不胜感激),可以考虑用其它的办法来实现类似的功能(如通过方法)。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200116A0W94L00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券