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

She*_*ter 33 rust

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

impl<T, U> Into<U> for T where U: From<T>
Run Code Online (Sandbox Code Playgroud)

有更具体的实现From,虽然Into目前只有3个特定的实现,这使得它似乎是From默认实现的主流决定.我确信有些时候我只想实现Into而不是From,但我没有看到它们.

Lev*_*ans 22

有趣的是,关于这些特征的原始RFCstd::convert提出了相反的措辞:

impl<T, U> From<T> for U where T: Into<U>
Run Code Online (Sandbox Code Playgroud)

但是在执行它的PR上,它被改为相反:

添加了From=> 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:

error:type参数T必须用作某些本地类型的类型参数(例如MyStruct<T>); 只有当前包中定义的特征可以为类型参数实现

但最后一刻的这种变化反映了这一点From并且Into基本相同.From被选择为首选,因为从"类型参数与本地类型"的观点来看它的限制性较小.

标准库中只有两个实现的例子Into而不是From:

impl Into<Vec<u8>> for String
impl Into<OsString> for PathBuf
Run Code Online (Sandbox Code Playgroud)

但他们是我认为他们的接口逻辑的反思.OsString实现了From<String>From<T> where T: AsRef<OsStr>,因为它们是天然的东西,你会想建立一个OsString从.

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

  • *`PathBuf`仍然实现`Into <OsString>`*←这已在1.14.0:D中修复.什么都没有在标准库中进入`Into <*>`. (3认同)