最近想啃下生命周期标注这块硬骨头,但是遇到一个疑问:
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
1
共 4 条评论, 1 页
评论区
写评论@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()这样的形式。
真是个悲伤的故事。 对以下内容的回复:
实现trait需要的签名是这个:
fn from_str<'a>(s: &'a str) -> Result<Self<'b>, Self::Err>;
你实现的签名是这个:fn from_str(s: &'b str) -> Result<Self<'b>, Self::Err>;
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.