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来添加它。

也许你可以回到教你这一点的源头,从根本上纠正问题,以防止其他人以同样的方式感到困惑

另见:


在提供的代码示例中,您没有实现任何特性。你忘了粘贴什么东西了吗?顺便说一下,非常感谢你向我解释了在当前的语言约束下你将如何实现枚举变量的特征。这确实与一个有趣的RFC()有关,该RFC()使枚举变量成为一级类型,这将允许您对Foo::Bar执行
impl Noise操作,并为您的示例中的
匹配提供语法支持。@Katie是的,我也希望有一天RFC(以某种形式)能够实现,但我认为还有许多其他功能需要更广泛的需求,我们必须等待。:-)