tokio_core :: net :: UdpCodec与关联类型的生存期

我试图实现从dns_parser包创建dns_parser::Packettokio_core::net::UdpCodec。该实现目前这个样子:tokio_core :: net :: UdpCodec与关联类型的生存期

pub struct MdnsCodec; 

impl UdpCodec for MdnsCodec {

type In = dns_parser::Packet;

type Out = (SocketAddr, dns_parser::Builder);

fn decode(&mut self, addr: &SocketAddr, buf: &[u8]) -> io::Result<Self::In> {

Ok(dns_parser::Packet::parse(buf).unwrap())

}

fn encode(&mut self, (addr, builder): Self::Out, into: &mut Vec<u8>) -> SocketAddr {

let packet_data = builder.build().unwrap();

into.extend(&packet_data);

addr

}

}

的dns_parser::Packet定义是:

pub struct Packet<'a> { 

pub header: Header,

pub questions: Vec<Question<'a>>,

pub answers: Vec<ResourceRecord<'a>>,

pub nameservers: Vec<ResourceRecord<'a>>,

pub additional: Vec<ResourceRecord<'a>>,

pub opt: Option<OptRecord<'a>>,

}

这失败,编译:

error[E0106]: missing lifetime specifier 

--> src/main.rs:18:15

|

18 | type In = dns_parser::Packet;

| ^^^^^^^^^^^^^^^^^^ expected lifetime parameter

error: aborting due to previous error

的问题是,我可以不知道要增加什么样的生命!我假设Packet需要与buf参数具有相同的生命周期。但我无法弄清楚如何正确表达这一点。

我已上传非工作为例,github上: https://github.com/Fulkerson/mdnsfuturestest

回答:

这是一个棘手的一个。据我所知,唯一能够实现这一目标的方法是每晚使用Rust(rustup toolchain install nightlyrustup default nightly),并使用夜间功能generic_associated_types。原因是相关类型(如type In)最初不被允许为泛型或具有任何类型/生命周期参数。

#![feature(generic_associated_types)] 

// ...includes...

pub struct MdnsCodec;

impl UdpCodec for MdnsCodec {

type In<'a> = dns_parser::Packet<'a>;

// ...rest of impl...

}

fn main() {

// ...code...

}

当然也有与使用预发布软件,例如你使用任何不稳定的特征也没有警告在任何时候改变出现的常见问题。

以上是 tokio_core :: net :: UdpCodec与关联类型的生存期 的全部内容, 来源链接: utcz.com/qa/265250.html

回到顶部