我有一个对象的trait,可以从一些索引中提供字节.这些可以是文件、被ptraced的进程、其他字节提供程序上的缓存等:
use std::result::Result;
use std::io::Error;
trait ByteProvider {
fn provide_bytes(&mut self, index: usize, dest: &mut[u8]) -> Result<usize, Error>;
}
struct ZeroProvider { }
impl ByteProvider for ZeroProvider {
fn provide_bytes(&mut self, _index: usize, dest: &mut[u8]) -> Result<usize, Error> {
dest.iter_mut().for_each(|e| *e = 0);
Ok(dest.len())
}
}
我还有一组小部件,用于实现ByteProvider特征的任何泛型类型:
struct HexDump<T: ByteProvider> {
provider: T
}
struct Disassembler<T: ByteProvider> {
provider: T
}
impl<T: ByteProvider> HexDump<T> {
pub fn new(provider: T) -> Self { Self { provider } }
pub fn dump(&mut self) {
let mut bytes = [0; 16];
self.provider.provide_bytes(0, &mut bytes).unwrap();
println!("{}", bytes.iter().map(|e| format!("{:02x}", e)).collect::<Vec<String>>().join(" "));
}
}
impl<T: ByteProvider> Disassembler<T> {
pub fn new(provider: T) -> Self { Self { provider } }
pub fn disassemble(&mut self) {
println!("Disassembly");
}
}
这可以很好地工作:
fn main() {
let provider = ZeroProvider {};
let mut dumper = HexDump::new(provider);
dumper.dump();
}
...但是,我想要同一数据的多个视图:
fn main() {
let provider = ZeroProvider {};
let mut dumper = HexDump::new(provider);
let mut disassembler = Disassembler::new(provider);
dumper.dump();
disassembler.disassemble();
}
然而,这当然不是有效的Rust,所以我向引用计数的智能指针寻求帮助,希望这能起作用:
use std::rc::Rc;
fn main() {
let provider = Rc::new(ZeroProvider {});
let mut dumper = HexDump::new(Rc::clone(&provider));
let mut disassembler = Disassembler::new(Rc::clone(&provider));
dumper.dump();
disassembler.disassemble();
}
但是,编译器不喜欢这样:
27 | impl<T: ByteProvider> HexDump<T> {
| ^^^^^^^^^^^^ ----------
| |
| unsatisfied trait bound introduced here
...
error[E0599]: the method `dump` exists for struct `HexDump<Rc<_, _>>`, but its trait bounds were not satisfied
--> src/main.rs:48:12
|
19 | struct HexDump<T: ByteProvider> {
| ------------------------------- method `dump` not found for this struct
...
48 | dumper.dump();
| ^^^^ method cannot be called on `HexDump<Rc<_, _>>` due to unsatisfied trait bounds
...对于反汇编程序也有类似的错误,我无法破译.我遗漏了什么?
我认为问题在于rc没有实现我的特征,但它没有公开它的嵌套对象接口吗?
如果可能的话,我希望窗口小部件(HexDump和反汇编程序)不要意识到它们的字节提供程序是共享的.这能做到吗?