0

我正在尝试实现一个从 dns_parser 板条箱tokio_core::net::UdpCodec创建一个。dns_parser::Packet目前的实现如下所示:

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

4

1 回答 1

1

这是一个棘手的问题。据我所知,让它工作的唯一方法是使用 Rust nightly ( rustup toolchain install nightlyand rustup default nightly) 并使用 nightly 功能generic_associated_typestype 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...
}

当然,使用预发布软件会出现一些常见问题,例如,您使用的任何不稳定功能都可能随时更改而不会发出警告。

于 2018-01-08T19:52:54.457 回答