FromStr和之间有什么真正的区别吗TryFrom<&str>?
从文档中的定义来看,一旦您替换 in ,它们看起来是&str相同T的TryFrom:
pub trait FromStr {\n type Err;\n fn from_str(s: &str) -> Result<Self, Self::Err>;\n}\n\npub trait TryFrom<T> {\n type Error;\n fn try_from(value: T) -> Result<Self, Self::Error>;\n}\nRun Code Online (Sandbox Code Playgroud)\n然后是解析:
\n\n\nfromStr\xe2\x80\x99s from_str 方法经常被隐式使用,通过 str\xe2\x80\x99s\nparse 方法。
\n
但是如果我们看看它的实现,我们会发现它除了提供稍微更短的调用方式之外没有做任何事情from_str:
pub fn parse<F: FromStr>(&self) -> Result<F, F::Err> {\n FromStr::from_str(self)\n}\nRun Code Online (Sandbox Code Playgroud)\n如果您查看 TryFrom 的库实现,那么它几乎完全由数字转换组成,尽管也有:
\nimpl<\'_, T, const N: usize> TryFrom<&\'_ [T]> for [T; N] where\n T: Copy, \ntype Error = TryFromSliceError\nRun Code Online (Sandbox Code Playgroud)\n这让人想起
\nimpl FromStr for String {\n type Err = core::convert::Infallible;\n #[inline]\n fn from_str(s: &str) -> Result<String, Self::Err> {\n Ok(String::from(s))\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n将 FromStr的示例实现从文档转换为 TryFrom很简单。
\nReddit 上有一个类似的问题,最好的答案似乎是“只实现两者”。
\n最后还有一个类似的问题,尽管它使用了错误的类型,并且 Serde 上下文会分散注意力。
\n所以:
\nFromStr和之间有什么真正的区别吗TryFrom<&str>?FromStr为编译器提供更多类型信息,因此可能有助于推理。它也更具体,从而对读者有所帮助。当目的是解析字符串时,我会使用FromStr,因为它可以通过该方法使用parse()。如果这只是为了转换,我会实现TryFrom<&str>.
另请记住,如FromStr 和 TryFrom<String> 特征之间的区别是什么?,FromStr先行TryFrom。
未来有什么计划来改善这种状况吗?
我不知道什么。
| 归档时间: |
|
| 查看次数: |
754 次 |
| 最近记录: |