< 返回版块

jmjoy 发表于 2019-12-25 00:44

Tags:lifetime,trait

最近想啃下生命周期标注这块硬骨头,但是遇到一个疑问:

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))
    }
}

这个编译是不成功的,但是具体原因想不通,有大神能指导一下吗?


Ext Link: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=597e8ac2fc1399ec4e4918d16fd05b7f

评论区

写评论
linjio 2019-12-25 23:10

@cfive 说得有理, 同样在文档中: you can parse an i32 with FromStr, but not a &i32。

FromStr trait的作用是从字符中解析出一个类型, 而不能从字符中解析其字符本身的引用,即&str类型。

从"/doc/rust/html/std/primitive.str.html#implementations",看到&str类型并没有实现FromStr trait,

建议题主可以试试new()这样的形式。

作者 jmjoy 2019-12-25 13:37

真是个悲伤的故事。 对以下内容的回复:

laizy 2019-12-25 13:02

实现trait需要的签名是这个: fn from_str<'a>(s: &'a str) -> Result<Self<'b>, Self::Err>; 你实现的签名是这个:fn from_str(s: &'b str) -> Result<Self<'b>, Self::Err>;

cfive 2019-12-25 09:43

https://doc.rust-lang.org/std/str/trait.FromStr.html#tymethod.from_str

FromStr does not have a lifetime parameter, and so you can only parse types that do not contain a lifetime parameter themselves.

1 共 4 条评论, 1 页