神秘的冲突实现

tad*_*ppo 5 rust

我试图在固定时间测试我的代码。所以我写了这样的东西:

use std::time::{SystemTime, UNIX_EPOCH};

trait Clock {
    fn now(&self) -> SystemTime;
}

trait MixInClock {
    type Impl;
}

struct RealClock;
impl<T: MixInClock<Impl = RealClock>> Clock for T {
    fn now(&self) -> SystemTime {
        SystemTime::now()
    }
}

struct FakeClock;
impl <T: MixInClock<Impl = FakeClock>> Clock for T {
    fn now(&self) -> SystemTime {
        UNIX_EPOCH
    }
}

struct DIContainer;
impl MixInClock for DIContainer {
    type Impl = FakeClock;
}
Run Code Online (Sandbox Code Playgroud)

这段代码给了我一个错误:


error[E0119]: conflicting implementations of trait `Clock`:
  --> src/lib.rs:19:1
   |
12 | impl<T: MixInClock<Impl = RealClock>> Clock for T {
   | ------------------------------------------------- first implementation here
...
19 | impl <T: MixInClock<Impl = FakeClock>> Clock for T {
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation
Run Code Online (Sandbox Code Playgroud)

为什么?不可能同时T实现MixInClock<Impl = RealClock>MixInClock<Impl = FakeClock>。对?

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=95e3647b30ae0e37c45ac18da495a3c5

Sve*_*ach 3

您遇到了Rust 一致性规则的一个长期存在的问题。有人提出了如何解决这个问题的建议,但该工作目前已被推迟。引用Jonas Schievink 对这个 bug 的最新评论

对此进行更新:2016 年,RFC 1672被提议修复此问题,但被推迟到 Chalk 集成完成。此外,根据rust-lang/rfcs#1672 (评论),允许这些类型的实现将允许用户表达互斥的特征,这是一个非常强大的功能,需要语言团队更深入的考虑(因此标记为也在 RFC 上被阻止)。