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
示例代码:
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() {
}
解决方案
你得到了递归错误,因为你只 derefself
一次,把它变成了&T
- 你当前试图为其实现特征的类型 - 而你想得到 a T
。如果您像在 impl for 中那样对它进行两次 deref,则不会出现该错误&mut T
。
但是,您会得到另一个错误,即该实现不起作用。您不能只取消引用共享引用,然后从被引用对象借用可变引用。*self
是一个&T
。&mut T
无论您如何取消它,您都无法从中获得。
推荐阅读
- python - 如何在 django 的管理面板中为 m2m 字段的 CheckboxSelectMultiple 添加滚动条?
- excel - VBA 按列表过滤表并发送电子邮件
- python - 如何在 docker 容器中使用本地文件?
- testing - 如何使用请求在 JEST 中测试异步调用而不使用模拟和等待反应钩子测试库
- angular - Firebase 经过身份验证的用户,但没有权限
- python - 无法在 PyQt5 中打印点击的行
- excel - 如何拒绝 application.inputbox 中的符号
- c++ - 了解 Getline 函数
- webpack - Livereload 服务器导致 ERR:CONNECTION REFUSED
- javascript - 使用条件 mongodb 在数组中检索对象