Rust中Arc可直接访问底层对象的原理及自定义包装类实现方法
实现原理
这个特性是Rust的Deref 隐式强制转换提供的能力。
标准库的Arc<T>实现了Deref<Target = T> trait:当你调用Arc实例上不存在的方法时,Rust编译器会自动对实例做多次解引用匹配,直到找到目标方法,这就是你可以直接在Arc<Vec<T>>上调用Vec自有方法的核心原因。
自定义Wrapper的实现方式
你只需要为自己的Wrapper结构体实现Deref trait,将关联类型Target指定为你包装的底层类型即可,示例代码如下:
use std::ops::Deref; struct Wrapper { underlying: Vec<i32>, my_custom_field_for_custom_logic: bool } impl Deref for Wrapper { type Target = Vec<i32>; fn deref(&self) -> &Self::Target { &self.underlying } }
实现完成后你就可以直接调用底层Vec的所有不可变方法了:
let wrap = Wrapper { underlying: vec![0,1,2,3], my_custom_field_for_custom_logic: true }; // 无需访问underlying字段,直接调用Vec方法 for x in wrap.iter() { println!("{}", x); } println!("长度: {}", wrap.len());
如果需要调用底层类型的可变方法(比如push、clear等),额外实现DerefMut trait即可:
use std::ops::DerefMut; impl DerefMut for Wrapper { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.underlying } } // 调用示例 let mut wrap = Wrapper { underlying: vec![0,1,2,3], my_custom_field_for_custom_logic: true }; wrap.push(4); println!("新长度: {}", wrap.len()); // 输出5
补充说明
- 方法调用的优先级是你自定义的
Wrapper结构体上的方法 > Deref转换后的底层类型方法,不会出现同名方法冲突的问题 - Deref强制仅发生在引用类型上,不会转移结构体的所有权
内容的提问来源于stack exchange,提问作者l3utterfly
相关产品推荐
相关产品推荐

