我最近看到使用dyn关键字的代码:
fn foo(arg: &dyn Display) {}
fn bar() -> Box<dyn Display> {}
Run Code Online (Sandbox Code Playgroud)
这个语法是什么意思?
我有这个简化的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>>,
}
Run Code Online (Sandbox Code Playgroud)
目的是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 …Run Code Online (Sandbox Code Playgroud) 我有这个代码(游乐场):
use std::sync::Arc;
pub trait Messenger : Sync + Send {
fn send_embed<F: FnOnce(String) -> String>(&self, u64, &str, f: F)
-> Option<u64> where Self: Sync + Send;
}
struct MyMessenger {
prefix: String,
}
impl MyMessenger {
fn new(s: &str) -> MyMessenger {
MyMessenger { prefix: s.to_owned(), }
}
}
impl Messenger for MyMessenger {
fn send_embed<F: FnOnce(String) -> String>(&self, channel_id: u64, text: &str, f: F) -> Option<u64> {
println!("Trying to send embed: chid={}, text=\"{}\"", channel_id, text);
None …Run Code Online (Sandbox Code Playgroud)