У меня есть этот упрощенный код Rust:
use std::io::Result;
pub trait PacketBuffer {}
pub trait DnsRecordData {
fn write<T: PacketBuffer>(&self, buffer: &mut T) -> Result<usize>;
}
pub struct DnsRecord<R: DnsRecordData + ?Sized> {
pub data: Box<R>,
}
pub struct DnsPacket {
pub answers: Vec<DnsRecord<dyn DnsRecordData>>,
}
Предполагается, что DnsRecord
сможет содержать любую структуру, реализующую черту DnsRecordData
, с различными структурами, представляющими A, AAAA, CNAME и т.д.
Это приводит к ошибке:
error[E0038]: the trait 'DnsRecordData' cannot be made into an object
--> src/lib.rs:14:5
|
14 | pub answers: Vec<DnsRecord<dyn DnsRecordData>>,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait 'DnsRecordData' cannot be made into an object
|
= note: method 'write' has generic type parameters
Что меня больше всего смутило, так это то, что, удаляя обобщенные элементы из DnsRecordData::write()
, он прекрасно компилируется:
use std::io::Result;
pub trait PacketBuffer {}
pub trait DnsRecordData {
fn write(&self, buffer: &mut dyn PacketBuffer) -> Result<usize>;
}
pub struct DnsRecord<R: DnsRecordData + ?Sized> {
pub data: Box<R>,
}
pub struct DnsPacket {
pub answers: Vec<DnsRecord<dyn DnsRecordData>>,
}
Если кто-нибудь сможет объяснить, что мне не хватает, я буду очень признателен.