tokio_core::net::UdpCodec 关联类型有生命周期
tokio_core::net::UdpCodec with lifetime on associated type
我正在尝试实现一个 tokio_core::net::UdpCodec
,它从 dns_parser 板条箱创建一个 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 nightly
和 rustup default nightly
)并使用每晚功能 generic_associated_types
。原因是关联类型(如 type In
)最初不允许是泛型或具有任何 type/lifetime 参数。
#![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
,它从 dns_parser 板条箱创建一个 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 nightly
和 rustup default nightly
)并使用每晚功能 generic_associated_types
。原因是关联类型(如 type In
)最初不允许是泛型或具有任何 type/lifetime 参数。
#![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...
}
使用预发布软件当然会出现一些常见问题,例如,您使用的任何不稳定的功能都可能在没有警告的情况下随时更改。