如何为Ref<RefCell<MyStruct>>正确限定Trait函数的全限定调用?
问题解决:Rust中对
RefMut<MyStruct>执行Trait方法的全限定调用 错误的核心原因是:my_ref.borrow_mut()返回的是RefMut<'_, MyStruct>类型,而你的MyTrait是为MyStruct实现的,并非RefMut。虽然.运算符会自动通过DerefMut trait解引用RefMut获取内部的MyStruct,但全限定调用(Trait::method(...))不会触发这种自动解引用,因此需要手动获取内部MyStruct的可变引用。
解决方案:手动解引用RefMut
你可以通过解引用操作符*获取RefMut内部的MyStruct实例,再生成可变引用传递给Trait方法:
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{})); // 手动解引用RefMut,获取内部MyStruct的可变引用 MyTrait::my_func(&mut *my_ref.borrow_mut()); }
原理说明
RefMut<T>实现了DerefMut<Target = T>,这意味着*ref_mut会直接返回内部的T实例。通过&mut *ref_mut我们得到了&mut MyStruct类型的引用,而这正是MyTrait::my_func所期望的参数类型,因此可以满足 trait 约束。
如果需要处理Ref<MyStruct>(不可变引用场景),逻辑完全一致:用&*my_ref.borrow()获取内部MyStruct的不可变引用即可。
内容的提问来源于stack exchange,提问作者Udo Eisenbarth
相关产品推荐
相关产品推荐

