【问题标题】:Unable to implement Into trait for a generic struct无法为通用结构实现 Into 特征
【发布时间】:2017-01-04 07:52:13
【问题描述】:

我在为 Rust 中的通用结构实现 Into 特征时遇到了麻烦。我正在尝试做的简化版本如下:

struct Wrapper<T> {
    value: T
}

impl<T> Into<T> for Wrapper<T> {
    fn into(self) -> T {
        self.value
    }
}

当我尝试编译时,我收到以下错误:

error: conflicting implementations of trait `std::convert::Into<_>` for type `Wrapper<_>`: [--explain E0119]
 --> <anon>:5:1
  |>
5 |> impl<T> Into<T> for Wrapper<T> {
  |> ^
note: conflicting implementation in crate `core`

我觉得问题出在标准库中的以下实现:

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

由于T可能实现From&lt;Wrapper&lt;T&gt;&gt;,这个可能是一个冲突的实现。有没有办法解决这个问题?例如,有没有办法让impl&lt;T&gt; 块将T 限制为不实现From&lt;Wrapper&lt;T&gt;&gt; 的类型?

【问题讨论】:

标签: generics type-conversion rust


【解决方案1】:

实际上...没有办法将其限制为类型 T 未实现 From&lt;Wrapper&lt;T&gt;&gt;。 Rust 没有“否定”子句。

通常,实现Into 的方法是简单地实现From 并获得Into 免费。但是,在您的情况下,实施将是:

impl<T> From<Wrapper<T>> for T {
    fn from(w: Wrapper<T>) -> T { w.value }
}

这符合孤儿规则。不允许为所有T 实现From

可能有技巧,但我在这里看不到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多