我应该在什么时候实现std::convert::From vs std::convert::Into



我看到std::convert::Into对任何实现std::convert::From:的东西都有一个实现

impl<T, U> Into<U> for T
where
U: From<T>, 

在Rust 1.0标准库中,有许多From的实现,而Into只在3个地方实现。这使得实现From似乎应该是默认的。我确信有时我想实现Into而不是From,但我没有看到它们。

TL;DR:更喜欢执行From


有趣的是,关于std::convert特性的原始RFC提出了相反的一揽子实现:

impl<T, U> From<T> for U
where
T: Into<U>

但在实施PR时,它被改为相反的:

添加From=>Into实现,这使得可以在不违反一致性的情况下在两个方向上添加转换。例如,我们现在有From<[T]> for Vec<T>,其中T: Clone,这产生了朝着另一个方向发展的相应Into——尽管这两种类型生活在不同的板条箱中。

我还认为,这解决了关于实现From而不是Into的一些问题

这个最后时刻的变化反映了FromInto基本相等。选择CCD_ 19作为优选的;类型参数对局部类型";观点。

在Rust 1.41.0之前,不可能制造impl<'a, T> Into<Foo> for &'a [T],而impl<'a, T> From<&'a [T]> for Foo是可能的。

第一次尝试引发E0210:

error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g., `MyStruct<T>`)
--> x.rs:3:10
|
3 | impl<'a, T> Into<Foo> for &'a [T] {
|          ^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter

在Rust 1.14之前的标准库中,只有两个实现Into而不是From的示例:

  • impl Into<Vec<u8>> for String
  • impl Into<OsString> for PathBuf

我认为这是它们接口逻辑的反射。OsString实现了From<String>From<T> where T: AsRef<OsStr>,因为它们是您想要构建OsString的自然产物。

然而,PathBuf仍然实现Into<OsString>作为其From<OsString>实现的反向操作,但该逻辑属于PathBuf,而不是OsString

相关内容

最新更新