gpt4 book ai didi

rust - tokio_core::net::UdpCodec 在关联类型上具有生命周期

转载 作者:行者123 更新时间:2023-11-29 08:29:43 24 4
gpt4 key购买 nike

我正在尝试实现一个 tokio_core::net::UdpCodec,它从 dns_parser crate 创建一个 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

最佳答案

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

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

关于rust - tokio_core::net::UdpCodec 在关联类型上具有生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47992794/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com