我看到std::convert::Into
具有实现std::convert::From
的所有内容的实现:
PlQuery.PlCall("consult(vuelos)");
impl<T, U> Into<U> for T where U: From<T>
有更具体的实现,而From
目前只有3个具体实现,这使得它似乎是默认情况下实施Into
的主流决策。我确信有时候我只想实现From
而不是Into
,但我没有看到它们。
答案 0 :(得分:21)
有趣的是,关于the original RFC特征的std::convert
提示了相反的一揽子意图:
impl<T, U> From<T> for U where T: Into<U>
但是在实施它的PR上,it was changed to the opposite:
已添加
From
=&gt;Into
实施,可以在不影响连贯性的情况下在两个方向上添加转化。例如,我们现在有From<[T]> for Vec<T> where T: Clone
,它产生相应的进入另一个方向 - 尽管这两种类型存在于不同的板条箱中。我也相信这解决了一些关于实现From而不是Into
的问题
确实无法制作impl<'a, T> Into<Foo> for &'a [T]
,而impl<'a, T> From<&'a [T]> for Foo
是可能的。
第一次尝试引发E0210
:
错误:类型参数
实现T
必须用作某些本地类型的类型参数(例如MyStruct<T>
);只有当前包中定义的特征可以为类型参数
但最后一刻的这种变化反映出From
和Into
基本相同。 From
被选为首选,因为&#34;类型参数与本地类型&#34;的限制较少。观点。
标准库中只有两个实现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
。