如何限定 Ref 的特征函数<RefCell<>>

问题描述 投票:0回答:1

考虑以下代码:

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>>
的特征函数?

rust traits
1个回答
0
投票

方法调用表达式,例如

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());
© www.soinside.com 2019 - 2024. All rights reserved.