Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 为什么会变成堆栈溢出?_Rust_Stack Overflow - Fatal编程技术网

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
    ,所以它只是直接给了我盒子。因此递归!