`FromStr` 和 `TryFrom<&str>` 之间有什么真正的区别吗?

hkB*_*Bst 5 rust

FromStr和之间有什么真正的区别吗TryFrom<&str>

\n

从文档中的定义来看,一旦您替换 in ,它们看起来是&str相同TTryFrom

\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n

然后是解析:

\n
\n

fromStr\xe2\x80\x99s from_str 方法经常被隐式使用,通过 str\xe2\x80\x99s\nparse 方法。

\n
\n

但是如果我们看看它的实现,我们会发现它除了提供稍微更短的调用方式之外没有做任何事情from_str

\n
pub fn parse<F: FromStr>(&self) -> Result<F, F::Err> {\n    FromStr::from_str(self)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

如果您查看 TryFrom 的库实现,那么它几乎完全由数字转换组成,尽管也有:

\n
impl<\'_, T, const N: usize> TryFrom<&\'_ [T]> for [T; N] where\n    T: Copy, \ntype Error = TryFromSliceError\n
Run Code Online (Sandbox Code Playgroud)\n

这让人想起

\n
impl 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}\n
Run Code Online (Sandbox Code Playgroud)\n

将 FromStr的示例实现从文档转换为 TryFrom很简单

\n

Reddit 上有一个类似的问题,最好的答案似乎是“只实现两者”。

\n

最后还有一个类似的问题,尽管它使用了错误的类型,并且 Serde 上下文会分散注意力。

\n

所以:

\n
    \n
  1. FromStr和之间有什么真正的区别吗TryFrom<&str>
  2. \n
  3. 目前关于其使用的最佳实践是什么?
  4. \n
  5. 未来有什么计划来改善这种状况吗?
  6. \n
\n

Cha*_*man 2

FromStr为编译器提供更多类型信息,因此可能有助于推理。它也更具体,从而对读者有所帮助。当目的是解析字符串时,我会使用FromStr,因为它可以通过该方法使用parse()。如果这只是为了转换,我会实现TryFrom<&str>.

另请记住,如FromStr 和 TryFrom<String> 特征之间的区别是什么?FromStr先行TryFrom

未来有什么计划来改善这种状况吗?

我不知道什么。