Rust 为什么会变成堆栈溢出?
因堆栈溢出而失败的简单测试用例:Rust 为什么会变成堆栈溢出?,rust,stack-overflow,Rust,Stack Overflow,因堆栈溢出而失败的简单测试用例: //trait表示FnMut有一个clone\u box方法 pub-trait-clonablefenmut:FnMut(A){ fn clone_box(&self)->box clone for box clonablenmut for F{ fn clone_box(&self)->box=box::new(|ux |{}); println!(“{:?}”,f(3)); println!(“{:?}”,f.clone()(4)); } 理论上: 在框
//trait表示FnMut有一个clone\u box方法
pub-trait-clonablefenmut:FnMut(A){
fn clone_box(&self)->box clone for box clonablenmut for F{
fn clone_box(&self)->box=box::new(|ux |{});
println!(“{:?}”,f(3));
println!(“{:?}”,f.clone()(4));
}
理论上:
框中调用.clone()
FnMut
上调用.clone\u box()
FnMut
现在可以自己调用.clone()
,因为它被标记为clone.clone\u box()
在新框中返回此克隆的FnMut
(self)框中手动调用.clone()
框上调用.clone\u box()
self.clone()
,这似乎意味着self=box
框
克隆()
,从步骤1开始第4步发生的实际原因是什么?实际发生的事情略有不同:
框中调用clone
框上调用clone\u框
框中调用clone
,关闭循环
这是因为
Clone
的实现只调用self.Clone\u box()
,但clone\u box
是ClonableFnMut
特性的一种方法。这个特性是在box上实现的。我认为在尝试克隆box
时遇到了一个问题,它只在实现clone
本身的类型上实现clone
,而您尝试在FnMut上调用clone代码>是不可能克隆的。正因为如此,我认为您遇到了一些Deref
s,本质上是克隆类型本身(我认为,这将完全解释您的错误)。我试图用Fn
s组合出一个工作示例,但我无法找到一个工作示例。FnMut可以进行克隆,只要它包含的所有内容都是克隆的。这里的代码与@Tanriol建议的使用**self.Yep的更改一起工作。就是这样,我只需要(**self.Clone_box()
。当我尝试(*self.clone_box()
之前,我忘记了self实际上是&self
,所以它只是直接给了我盒子。因此递归!