首页 > 解决方案 > 为什么在尝试为所有引用类型实现特征时会出现递归

问题描述

我是 rust 新手,在实现特性方面遇到了麻烦。让我知道我是否以错误的方式处理这个问题。我正在尝试使用两个函数来设置一个特征来访问一个值。get_value 似乎运行正常,但是在尝试使用 &mut 自引用设置 set_value 时,出现以下错误

warning: function cannot return without recursing
 --> src\main.rs:7:5
  |
7 |     fn set_value(&mut self, new_value: bool) {
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot return without recursing
8 |         (*self).set_value(new_value);
  |         ---------------------------- recursive call site
  |
  = note: `#[warn(unconditional_recursion)]` on by default
  = help: a `loop` may express intention better if this is on purpose

warning: 1 warning emitted

示例代码:

trait Trait1 {
    fn set_value(&mut self, new_value: bool);
    fn get_value(&self) -> bool;
}

impl<'a, T> Trait1 for &'a T where T: Trait1 {
    fn set_value(&mut self, new_value: bool) {
        (*self).set_value(new_value);
    }
    fn get_value(&self) -> bool {
        (*self).get_value()
    }
}

impl<'a, T> Trait1 for &'a mut T where T: Trait1 {
    fn set_value(&mut self, new_value: bool) {
        (**self).set_value(new_value)
    }    
    fn get_value(&self) -> bool {
        (**self).get_value()
    }
}

struct Foo {
    value: bool
}

impl Trait1 for Foo {
    fn set_value(&mut self, new_value: bool) {
        self.value = new_value;
    }
    fn get_value(&self) -> bool {
        self.value
    }
}

fn main() {
    
}

标签: rust

解决方案


你得到了递归错误,因为你只 derefself一次,把它变成了&T- 你当前试图为其实现特征的类型 - 而你想得到 a T。如果您像在 impl for 中那样对它进行两次 deref,则不会出现该错误&mut T

但是,您会得到另一个错误,即该实现不起作用。您不能只取消引用共享引用,然后从被引用对象借用可变引用。*self是一个&T&mut T无论您如何取消它,您都无法从中获得。


推荐阅读