【问题标题】:When should I implement std::convert::From vs std::convert::Into?我应该什么时候实现 std::convert::From 与 std::convert::Into?
【发布时间】:2015-04-23 02:26:15
【问题描述】:

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

【问题讨论】:

    标签: rust


    【解决方案1】:

    TL;DR:更喜欢实现From


    有趣的是,the original RFC 关于 std::convert 特征提出了相反的一揽子实现:

    impl<T, U> From<T> for U
    where
        T: Into<U>
    

    但是在 PR 实施它时,it was changed to the opposite:

    添加了From => Into 实现,这使得可以在不违反连贯性的情况下添加双向转换。例如,我们现在有From&lt;[T]&gt; for Vec&lt;T&gt;,其中T: Clone,这会产生相应的Into,这会朝着另一个方向发展——尽管这两种类型存在于不同的板条箱中。

    我也相信这解决了一些关于实现 From 而不是 Into 的问题

    最后一刻的变化反映了FromInto 基本上是等价的。 From 被选为首选,因为从“类型参数与本地类型”的角度来看,它的限制较少。

    Rust 1.41.0 之前,无法创建impl&lt;'a, T&gt; Into&lt;Foo&gt; for &amp;'a [T],而impl&lt;'a, T&gt; From&lt;&amp;'a [T]&gt; 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&lt;Vec&lt;u8&gt;&gt; for String
    • impl Into&lt;OsString&gt; for PathBuf

    我认为这些是他们接口逻辑的体现。 OsString 实现了 From&lt;String&gt;From&lt;T&gt; where T: AsRef&lt;OsStr&gt;,因为它们是您想要构建 OsString 的自然事物。

    但是,PathBuf 仍然将Into&lt;OsString&gt; 实现为其From&lt;OsString&gt; 实现的反向操作,但这个逻辑属于PathBuf,而不是OsString

    【讨论】:

    • PathBuf 仍然实现 Into&lt;OsString&gt; ← 这已在 1.14.0 中修复:D。标准库中没有任何 impl Into&lt;*&gt; 了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多