相关疑难解决方法(0)

Rust中特征的冲突实现

我想实现一个自定义特征&'a str和整数i32,但Rust不允许我:

use std::convert::Into;

pub trait UiId {
    fn push(&self);
}

impl<'a> UiId for &'a str {
    fn push(&self) {}
}

impl<T: Into<i32>> UiId for T {
    fn push(&self) {}
}

fn main() {}
Run Code Online (Sandbox Code Playgroud)

无法编译时出现以下错误:

error[E0119]: conflicting implementations of trait `UiId` for type `&str`:
  --> src/main.rs:11:1
   |
7  | impl<'a> UiId for &'a str {
   | ------------------------- first implementation here
...
11 | impl<T: Into<i32>> UiId for T {
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `&str`
   | …
Run Code Online (Sandbox Code Playgroud)

generics implementation traits rust

11
推荐指数
2
解决办法
2155
查看次数

使用泛型类型时,如何实现"From"的冲突?

我正在尝试实现一个错误枚举,它可能包含与我们的某个特征相关的错误,如下所示:

trait Storage {
    type Error;
}

enum MyError<S: Storage> {
    StorageProblem(S::Error),
}
Run Code Online (Sandbox Code Playgroud)

我还试图实现From特性以允许MyError从一个实例构建Storage::Error:

impl<S: Storage> From<S::Error> for MyError<S> {
    fn from(error: S::Error) -> MyError<S> {
        MyError::StorageProblem(error)
    }
}
Run Code Online (Sandbox Code Playgroud)

(游乐场)

但是这无法编译:

error[E0119]: conflicting implementations of trait `std::convert::From<MyError<_>>` for type `MyError<_>`:
 --> src/lib.rs:9:1
  |
9 | impl<S: Storage> From<S::Error> for MyError<S> {
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: conflicting implementation in crate `core`:
          - impl<T> std::convert::From<T> for T;
Run Code Online (Sandbox Code Playgroud)

我不明白为什么编译器认为这已经实现了.错误消息告诉我已经有一个From<MyError<_>>(有)的实现,但我不是试图在这里实现 - 我正在尝试实现,From<S::Error> …

rust

9
推荐指数
2
解决办法
1558
查看次数

特质专业化如何实际起作用?

我试图专门化一个特性,但由于"实施冲突"而无法编译.但我对专业化的理解是,更具体的实现应该覆盖更通用的实现.这是一个非常基本的例子:

mod diving {
    pub struct Diver<T> {
        inner: T
    }
}

mod swimming {
    use diving;
    pub trait Swimmer {
        fn swim(&self) {
            println!("swimming")
        }
    }

    impl<T> Swimmer for diving::Diver<T> {

    }
}

mod drowning {
    use diving;
    use swimming;
    impl swimming::Swimmer for diving::Diver<&'static str> {
        fn swim(&self) {
            println!("drowning, help!")
        }
    }
}

fn main() {
    let x = diving::Diver::<&'static str> {
        inner: "Bob"
    };
    x.swim()
}
Run Code Online (Sandbox Code Playgroud)

错误是:

rustc 1.18.0 (03fc9d622 2017-06-06)
error[E0119]: conflicting implementations of trait `swimming::Swimmer` …
Run Code Online (Sandbox Code Playgroud)

specialization rust

2
推荐指数
1
解决办法
654
查看次数

标签 统计

rust ×3

generics ×1

implementation ×1

specialization ×1

traits ×1