Rust中共享实现Trait的对象时的编译问题及解决问询
问题原因
RcByteProvider 的 ZeroProvider,Rc 自己没实现这个 trait,编译器就不认。虽然 Rc 支持 Deref 自动解引用到内部对象,但 Rust 的 trait 系统不会因为这个就自动给 Rc
解决方法
不用改 HexDump 和 Disassembler,只要给所有包裹着 ByteProvider 实现类型的 Rc
先看原始代码的基础结构:
trait ByteProvider { fn get_byte(&self, index: usize) -> u8; } struct ZeroProvider; impl ByteProvider for ZeroProvider { fn get_byte(&self, _index: usize) -> u8 { 0 } } struct HexDump<P: ByteProvider> { provider: P, } struct Disassembler<P: ByteProvider> { provider: P, }
添加这个通用实现:
use std::rc::Rc; // 只要T实现了ByteProvider,Rc<T>就自动实现ByteProvider impl<T: ByteProvider> ByteProvider for Rc<T> { fn get_byte(&self, index: usize) -> u8 { // 这里可以直接写self.get_byte(index),Deref会自动解引用到内部T self.get_byte(index) } }
之后就能正常共享实例了:
fn main() { let shared_provider = Rc::new(ZeroProvider); let hexdump = HexDump { provider: Rc::clone(&shared_provider), }; let disassembler = Disassembler { provider: Rc::clone(&shared_provider), }; }
额外提示
如果之后需要在多线程场景用 Arc,用同样的逻辑给 Arc<T> 实现 ByteProvider 就行,代码几乎一样。
内容的提问来源于stack exchange,提问作者Robert Larsen
相关产品推荐
相关产品推荐

