当使用 Rust 中的 Serde 板条箱时,我尝试添加一个#[serde(try_from = String)]
容器属性 https://serde.rs/container-attrs.html到一个实现的类型FromStr
因此可以从字符串中解析。不幸的是,这对于 Serde 来说似乎还不够,从编译器错误消息来看,很明显我必须手动实现TryFrom<String>
, too.
Why is TryFrom<String>
对于所有实现的类型,不会自动实现FromStr
?为什么字符串的错误转换有一个单独的特征?这两个特征有什么区别?
FromStr
Rust 1.0 中很稳定,TryFrom
Rust 1.34 中已稳定;在该特征存在之前,很难使用它。
Why is TryFrom<String>
对于所有实现的类型,不会自动实现FromStr
?
这会导致已经实现了这两种方法的类型产生歧义TryFrom
and FromStr
。一种高级形式专业化需要允许这样做。
为什么字符串的错误转换有一个单独的特征?
FromStr
从借用的字符串切片创建一个拥有的值(&str
),所以它在语义上与取得所有权不同String
. TryFrom<String>
将允许您重用分配给String
.
更接近的模拟是impl<'a> TryFrom<&'a str> for ...
,但是在特征中具有生命周期使得在从字符串中解析值的“简单”情况下使用它变得更加复杂。
也可以看看:
- Rust 的 From/TryFrom 实现应该定位引用还是值? https://stackoverflow.com/q/48244892/155423
- 使用泛型类型时,“From”的实现如何会发生冲突? https://stackoverflow.com/q/37347311/155423
- TryFrom 和 TryFrom> 有什么区别? https://stackoverflow.com/q/65209340/155423
- 如何实现具有具体生命周期的 FromStr? https://stackoverflow.com/q/28931515/155423
- FromStr 特征不暴露生命周期的原因是什么? https://stackoverflow.com/q/30355949/155423
- 当类型约束中的引用之一是本地引用时,如何编写引用的生命周期? https://stackoverflow.com/q/44343166/155423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)