我看到它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.