Enums 如何在为其实现特征的现有类型的枚举的作用域中实现特征?
如何在为其实现特征的现有类型的枚举的作用域中实现特征 我有这个:Enums 如何在为其实现特征的现有类型的枚举的作用域中实现特征?,enums,rust,traits,Enums,Rust,Traits,如何在为其实现特征的现有类型的枚举的作用域中实现特征 我有这个: extern crate pnet; use pnet::packet::ipv4::Ipv4Packet; use pnet::packet::ipv6::Ipv6Packet; enum EthernetType { IPv4, ARP, VLAN, IPv6, Unknown(u16), } enum IPPacket<'a> { IPv4(Ipv4Packe
extern crate pnet;
use pnet::packet::ipv4::Ipv4Packet;
use pnet::packet::ipv6::Ipv6Packet;
enum EthernetType {
IPv4,
ARP,
VLAN,
IPv6,
Unknown(u16),
}
enum IPPacket<'a> {
IPv4(Ipv4Packet<'a>),
IPv6(Ipv6Packet<'a>),
}
fn ip_decode(pkt: &[u8]) -> IPPacket {
let version = (pkt[0] & 0xf0) >> 4;
if version == 4 {
IPPacket::IPv4(Ipv4Packet::new(&pkt).unwrap())
} else {
IPPacket::IPv6(Ipv6Packet::new(&pkt).unwrap())
}
}
fn main() {
// Parse ethernet packet here...
// ...
let ip_packet = ip_decode(b"deadbeef");
println!("{:?}", ip_packet.payload());
}
我认为包
特性将通过Ipv4Packet
派生出来
如何在现有类型的枚举的作用域中实现特征
为枚举实现特征的方式与为结构实现特征的方式相同:
trait Noise {
fn noise(&self);
}
enum Foo {
Bar,
Baz,
}
impl Noise for Foo {
fn noise(&self) {
match self {
Foo::Bar => println!("bar bar bar"),
Foo::Baz => println!("baz baz baz"),
}
}
}
为其实现特征的现有类型的枚举
我认为数据包
特征会被派生出来
事实并非如此。如果需要,这样做会阻止人们实现他们自己的特性代码。它也不会在所有情况下都起作用,比如一个变体没有实现它
trait Noise {
fn noise(&self);
}
struct Bar;
impl Noise for Bar {
fn noise(&self) {
println!("bar bar bar");
}
}
struct Baz;
impl Noise for Baz {
fn noise(&self) {
println!("baz baz baz");
}
}
enum Foo {
Bar(Bar),
Baz(Baz),
}
impl Noise for Foo {
fn noise(&self) {
match self {
Foo::Bar(bar) => bar.noise(),
Foo::Baz(baz) => baz.noise(),
}
}
}
从概念上讲,该语言可以扩展以支持一些注释来实现这一点,但我从未听说过有人建议这样做。可以考虑创建RFC来添加它。
也许你可以回到教你这一点的源头,从根本上纠正问题,以防止其他人以同样的方式感到困惑
另见:
impl Noise操作,并为您的示例中的匹配提供语法支持。@Katie是的,我也希望有一天RFC(以某种形式)能够实现,但我认为还有许多其他功能需要更广泛的需求,我们必须等待。:-)