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

时间:2015-04-23 02:26:16

标签: rust

我看到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,但我没有看到它们。

1 个答案:

答案 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>);只有当前包中定义的特征可以为类型参数

实现

但最后一刻的这种变化反映出FromInto基本相同。 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