Compiler errors 锈蚀不匹配的类型使编译器混乱

Compiler errors 锈蚀不匹配的类型使编译器混乱,compiler-errors,rust,type-mismatch,Compiler Errors,Rust,Type Mismatch,我尝试使用impl来处理一些奇怪的类型逻辑。下面是该错误的快速重建: trait Schrodingers {} struct AliveCat; impl Schrodingers for Container<AliveCat> {} struct DeadCat; impl Schrodingers for Container<DeadCat> {} struct Container<Cat1> where Container<Cat1&

我尝试使用impl来处理一些奇怪的类型逻辑。下面是该错误的快速重建:

trait Schrodingers {}

struct AliveCat;
impl Schrodingers for Container<AliveCat> {}
struct DeadCat;
impl Schrodingers for Container<DeadCat> {}

struct Container<Cat1>
    where Container<Cat1>: Schrodingers
{
    cat: Cat1,
}

impl<Cat2> Container<Cat2>
    where Container<Cat2>: Schrodingers
{
    fn dead_cat() -> Container<DeadCat> {
        let observed_cat = DeadCat;
        Container { cat: observed_cat }
    }

    fn alive_cat() -> Container<AliveCat> {
        let observed_cat = AliveCat;
        Container { cat: observed_cat }
    }
}

fn main() {
    let dead_cat = Container::dead_cat();
    let alive_cat = Container::alive_cat();
}
trait Schrodingers{}
生命结构;
容器{}的impl薛定谔方程
结构死猫;
容器{}的impl薛定谔方程
结构容器
何处:薛定谔
{
猫:猫1,
}
impl容器
何处:薛定谔
{
fn死_cat()->容器{
让被观察的猫=死猫;
容器{cat:observed_cat}
}
fn活的_cat()->容器{
让被观察的猫=AliveCat;
容器{cat:observed_cat}
}
}
fn main(){
让死猫=容器::死猫();
let alive_cat=容器::alive_cat();
}
这将导致编译器错误:

错误[E0308]:类型不匹配
-->src/main.rs:19:26
|
19 |集装箱{cat:observed|cat}
|^^^^^^^^^^^^^^应为类型参数,找到结构'DeadCat'`
|
=注意:应为'Cat2'类型`
=注意:找到类型“死猫”`
错误[E0308]:类型不匹配
-->src/main.rs:19:9
|
19 |集装箱{cat:observed|cat}
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^预期结构为“死猫”,找到类型参数
|
=注意:应为“容器”类型`
=注意:找到类型“容器”`
错误[E0308]:类型不匹配
-->src/main.rs:24:26
|
24 |集装箱{cat:observed|cat}
|^^^^^^^^^^^^应为类型参数,找到结构'AliveCat'`
|
=注意:应为'Cat2'类型`
=注意:找到类型`AliveCat`
错误[E0308]:类型不匹配
-->src/main.rs:24:9
|
24 |集装箱{cat:observed|cat}
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^所需的结构为'AliveCat',已找到类型参数
|
=注意:应为“容器”类型`
=注意:找到类型“容器”`

我已经能够使用其他方法解决这个问题,但是为什么编译器会感到困惑呢?

删除
结构
本身上的
where
子句可以使它工作,就像在
活动中的
容器::
中的限定as一样。我认为
struct
/
impl
(两者都需要对方)的循环性质意味着推理失败。我们也可以完全摆脱
Cat2
,在单独的
impl
块中实现
Container
Container
。但事实上,失败的推论令人惊讶。谢谢!我不知道您提到的限定语法是如何处理结构声明的,它解决了这个问题。