考虑以下代码:
use std::{cell::RefCell, rc::Rc};
trait MyTrait {
fn my_func(&mut self) {}
}
struct MyStruct;
impl MyTrait for MyStruct {}
fn main() {
let my_ref=Rc::new(RefCell::new(MyStruct{}));
my_ref.borrow_mut().my_func();
}
这当然很好用。如果我有两个具有相同函数名称的特征,我必须使用完全限定的版本。如果我尝试:
MyTrait::my_func(&mut my_ref.borrow_mut());
而不是
my_ref.borrow_mut().my_func();
我收到错误消息:
the trait bound `RefMut<'_, MyStruct>: MyTrait` is not satisfied the trait `MyTrait` is implemented for `MyStruct`
如何正确地完全限定
<Ref<RefCell<MyStruct>>
的特征函数?
方法调用表达式,例如
foo.my_func()
,根据需要自动取消引用和/或借用接收者;这与常规函数参数形成对比,例如在 my_func(foo)
中,后者仅执行常规 类型强制转换。
在这种情况下,
my_ref.borrow_mut()
的类型是RefMut<'_, MyStruct>
,而MyTrait::my_func
的第一个参数所需的类型是&mut MyStruct
。
RefMut<'_, T>
实现 DerefMut<Target = T>
。 因此,我们可以调用该实现的 deref_mut
方法,或者(在我看来,更符合人体工程学)使用 dereference operator
、*
以及显式重借:
MyTrait::my_func(&mut *my_ref.borrow_mut());