我看到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
的一些问题
这个最后时刻的变化反映了From
和Into
基本相等。选择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
。