Recursion 为什么decorator模式适用于所拥有的类型,但会导致引用的特征评估溢出(E0275)?

Recursion 为什么decorator模式适用于所拥有的类型,但会导致引用的特征评估溢出(E0275)?,recursion,rust,decorator,traits,Recursion,Rust,Decorator,Traits,在Rust中使用decorator设计模式进行实验时,我遇到了一个我认为可能是编译器错误的问题,但我对该语言太陌生了,无法自信 我认为下面的示例代码不应该生成递归特征错误 可转换为i64的简单类型: enum MyNumbers{ 零,, 一,, 二,, } 来自i64的impl{ fn from(n:MyNumbers)->Self{ 匹配{ MyNumbers::零=>0, MyNumbers::One=>1, MyNumbers::Two=>2, } } } 这里是一个可以在装饰器中使用

在Rust中使用decorator设计模式进行实验时,我遇到了一个我认为可能是编译器错误的问题,但我对该语言太陌生了,无法自信

我认为下面的示例代码不应该生成递归特征错误

可转换为
i64
的简单类型:

enum MyNumbers{
零,,
一,,
二,,
}
来自i64的impl{
fn from(n:MyNumbers)->Self{
匹配{
MyNumbers::零=>0,
MyNumbers::One=>1,
MyNumbers::Two=>2,
}
}
}
这里是一个可以在装饰器中使用的结构:

struct MyWrapper{
n:n,
}
MyWrapper
可以转换为
i64
,如果
N
可以转换为
i64

impl From for i64
哪里
N:进入,
{
fn-from(包装器:MyWrapper)->Self{
把…包装成
}
}

这正是我所期望的

现在,我希望能够从
MyWrapper
构建一个
i64
,而无需使用它。我将我的
trait实现更改为对引用进行操作:

impl From for i64{
fn from(n:&MyNumbers)->Self{
匹配{
MyNumbers::零=>0,
MyNumbers::One=>1,
MyNumbers::Two=>2,
}
}
}
i64的impl
哪里
&阿南:进入,
{
fn from(包装器:&'a MyWrapper)->Self{
(&wrapper.n).into()
}
}

但是现在

error[E0275]:评估需求'i64:From'时溢出`
-->src/main.rs:34:13
|
34 |设i=i64::from(&w);
|             ^^^^^^^^^
|
=帮助:考虑添加一个“γ”![recursion_limit=“256”]`属性到您的板条箱(`playerd`)
=注意:由于“&MyWrapper”的“Into”impl的要求,因此需要`
=注:由于对'i64'的'From'impl的要求,需要`
=注:126冗余需求隐藏
=注:由于对'i64'的'From'impl的要求,需要`
为什么这对于拥有的类型是好的,而不是引用

而且,这让我很困惑- 不调用
i64::from()
很好-
调用不同的
i64::from
错误-但不应评估我的代码

fn main(){
i64::from(32i32);
}
编译器错误


作为一种解决方法,我不得不求助于#[派生(复制)],以防止我的类型在转换的每个级别被消耗。也许From/Into不适合这种模式。。。。直到语言更加成熟。

谢谢@kmdreko。对这实际上是一个已知的5年前的编译器错误。谢谢