为什么在尝试为所有引用类型实现特征时会出现递归

roi*_*and 2 rust

我是 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
Run Code Online (Sandbox Code Playgroud)

示例代码:

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() {
    
}
Run Code Online (Sandbox Code Playgroud)

isa*_*tfa 5

您会遇到递归错误,因为您只解引用self一次,将其转换为&T- 您当前正在尝试为其实现特征的类型 - 而您想要获得 a T。如果您像在 impl for 中那样取消引用两次,则不会收到该错误&mut T

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