我是 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)
您会遇到递归错误,因为您只解引用self一次,将其转换为&T- 您当前正在尝试为其实现特征的类型 - 而您想要获得 a T。如果您像在 impl for 中那样取消引用两次,则不会收到该错误&mut T。
但是,您会收到另一个错误,即该实现不起作用。您不能只是解引用共享引用,然后从引用对象借用可变引用。*self是一个&T. &mut T无论你如何取消引用,你都无法从中得到 a 。