Rust 神秘的冲突实现

Rust 神秘的冲突实现,rust,Rust,我试图用固定的时间测试我的代码。所以我写了这样的东西: 使用std::time::{SystemTime,UNIX_EPOCH}; 特征时钟{ fn now(&self)->SystemTime; } 性状混合体{ Impl型; } 结构实时时钟; T的impl时钟{ fn now(&self)->SystemTime{ SystemTime::now() } } 结构假时钟; T的impl时钟{ fn now(&self)->SystemTime{ UNIX_时代 } } 结构双容器; 用于双

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

使用std::time::{SystemTime,UNIX_EPOCH};
特征时钟{
fn now(&self)->SystemTime;
}
性状混合体{
Impl型;
}
结构实时时钟;
T的impl时钟{
fn now(&self)->SystemTime{
SystemTime::now()
}
}
结构假时钟;
T的impl时钟{
fn now(&self)->SystemTime{
UNIX_时代
}
}
结构双容器;
用于双容器的impl MixInClock{
Impl型=假时钟;
}
此代码给了我一个错误:


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

错误[E0119]:trait'Clock'的冲突实现:
-->src/lib.rs:19:1
|
12 | T的impl时钟{
|-------------------------------------------------------这里的第一个实现
...
19 | T的impl时钟{
|冲突的实现
为什么?不可能
T
同时实现
MixInClock
MixInClock
。对吗

您遇到了一个问题。有人建议如何解决这个问题,但目前工作已被推迟。引用:

对此进行更新:2016年,有人提议解决这个问题,但推迟到白垩语整合完成。此外,据报道,允许这些类型的impl将允许用户表达相互排斥的特征,这是一个非常强大的功能,需要语言团队更深入地考虑(因此在RFC上也标记为阻塞)


虽然Sven的回答是正确的,这是Rust的一致性规则的问题,但您可以通过稍微概括一下您的代码来解决这个问题。在实践中,当您有两种不同的类型,它们应该具有不同的行为,但具有相似的接口时,为此创建一个特性通常是有用的

在这种情况下,您可以为
RealClock
FakeClock
创建各自可以实现的特性,并在通用
Clock
实现中使用该特性,而不是直接添加每个特性的行为:

//RealClock和FakeClock的公共接口,分别实现
特征时钟输入{
fn now()->SystemTime;
}
impl时钟RealClock的impl{
fn now()->SystemTime{
SystemTime::now()
}
}
IMP时钟用于伪造时钟{
fn now()->SystemTime{
UNIX_时代
}
}
//MixInClock现在只需要修改Self::Impl实现了ClockImpl
性状混合体{
Impl类型:ClockImpl;
}
//对于RealClock和FakeClock的特定行为,我们调用T::Impl::now()方法
T的impl时钟{
fn now(&self)->SystemTime{
::现在()
}
}