如何在已实现特征的现有类型的枚举范围内实现特征?

2024-05-09

如何在已实现特征的现有类型的枚举范围内实现特征?

我有这个:

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());
}

编译器抱怨我没有实现Packet trait https://docs.rs/pnet/0.11.1/pnet/packet/trait.Packet.html对于我的枚举:

error[E0599]: no method named `payload` found for type `IPPacket<'_>` in the current scope
  --> src/main.rs:32:32
   |
14 | enum IPPacket<'a> {
   | ----------------- method `payload` not found for this
...
32 |     println!("{:?}", ip_packet.payload());
   |                                ^^^^^^^
   |
   = help: items from traits can only be used if the trait is implemented and in scope
   = note: the following trait defines an item `payload`, perhaps you need to implement it:
           candidate #1: `pnet::packet::Packet`

我以为Packet特质将通过以下方式得出Ipv4Packet<'a> and Ipv6Packet<'a>?


如何在现有类型的枚举范围内实现特征

为枚举实现特征的方式与为结构实现特征的方式相同:

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"),
        }
    }
}

实现该特征的现有类型的枚举

我以为Packet将衍生出特征

它不是。这样做会阻止人们实施他们的own如果需要的话,可以提供该特征的代码。它也不会在所有情况下都起作用,例如当一种变体没有实现它时。

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

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

也可以看看:

  • 特征可以用于枚举类型吗? https://stackoverflow.com/q/51567350/155423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在已实现特征的现有类型的枚举范围内实现特征? 的相关文章

随机推荐

  • React Native Android 示例不起作用

    我克隆了存储库 https github com facebook react native https github com facebook react native并尝试在 Android 模拟器上运行 UIExplorer 示例 g
  • Android 连接有时会被拒绝(并非所有时候)

    我编写了一个 WiFi Direct 代码连接并在它们之间创建了一个连接 然后我创建了一个ServerSocket在第一面和一个Socket在客户端并开始在它们之间发送数据 第一次启动应用程序时它工作成功 但是当我关闭应用程序并再次启动它时
  • Java 泛型和数字类型

    我想创建一个通用方法来有效地执行此操作 class MyClass static
  • 如何在 Asp.net Gridview 列中添加复选框单击事件

    我在 asp 中有一个 gridview 其中我添加了第一列作为复选框列 现在我想选择此列并获取该行的 id 值 但我不知道该怎么做 这是我的 Aspx 代码
  • 查询查找表中姓名和号码之间的重复项

    SELECT count lower name number FROM tbl GROUP BY lower name number HAVING count gt 1 输入表1 slno name number 1 aaa 111 2 A
  • Netflix Eureka 和本地环境中的 2 个应用程序实例

    我正在开始使用 Netflix Eureka 并使用它的 1 1 145 https github com Netflix eureka tree 1 1 145 https github com Netflix eureka tree 1
  • 为什么设置 MediaRecorder 时显示错误 IllegalStateException?

    我的代码设置 MediaRecorder 它显示行集质量错误 mMediaRecorder new MediaRecorder Step 1 Unlock and set camera to MediaRecorder mCamera st
  • PowerShell 中的触摸功能

    我最近在 PowerShell 配置文件中添加了触摸功能 PS gt notepad profile function touch Set Content Path args 0 Value null 保存并运行测试 touch myfil
  • 向 Python 2.6 添加 SSL 支持

    我尝试使用sslPython 2 6 中的模块 但我被告知它不可用 安装OpenSSL后 我重新编译2 6 但问题仍然存在 有什么建议么 您安装了 OpenSSL 开发库吗 我必须安装openssl devel例如 在 CentOS 上 在
  • 在 android studio 上单击推送通知后重定向到特定活动

    我正在努力开发一个 Android 应用程序 以便在单击所有传入的推送通知时将应用程序重定向到特定的活动页面 我是 Android 开发新手 对我的编程感到抱歉 下面是推送通知部分的 android manifest xml 如果对此主题有
  • Paradox 表 - Oledb 异常:外部表不是预期的格式

    我正在使用 Oledb 从 Paradox 表中读取一些数据 我遇到的问题是 当我将代码复制到控制台应用程序时 代码可以工作 但在 WinForms 中却不行 两者都以 x86 进行调试 我实际上只是复制代码 在 WinForms 应用程序
  • 如何将 wsdl 内部架构设置为 Jaxb2Marshaller 以验证我所做的每篇文章?

    我正在使用 SOAP Web 服务 在调用它之前我必须验证每个 xml 帖子 所以我正在使用 The CXF codegen 插件生成POJO树结构 第三部分 wsdl xxxx soap service wsdl 一个类实现Web服务网关
  • KineticJS - 将舞台缩放到视口

    我正在努力将默认分辨率设置为 1366x756 我会根据视口来放大和缩小它 类似于此处显示的示例 http blogs msdn com b davrous archive 2012 04 06 modernizing your html5
  • 在ansible中合并字典

    我目前正在构建一个使用 ansible 安装 PHP 的角色 并且在合并字典时遇到一些困难 我尝试了多种方法来做到这一点 但我无法让它像我想要的那样工作 A vars file my default values key value my
  • 矩阵向量变换

    我正在编写一个代码来制作软件蒙皮器 骨骼 皮肤动画 并且我正处于 优化 阶段 蒙皮器工作得很好 并且在 Core 上 1 09 毫秒内对 4900 个三角形网格与 22 个骨骼进行蒙皮Duo 2 Ghz 笔记本 我需要知道的是 1 有人可以
  • 通过单击字段启用非活动字段

    是否可以有一组非活动字段 如果单击其中一个字段 则某些字段将变为必填字段并运行某些代码段 举例来说 您显示了三个字段
  • Google 翻译 TTS API 被阻止

    Google 实施了验证码来阻止人们访问 TTS 翻译 API 我在我的移动应用程序中使用它 现在 它没有返回任何东西 如何绕过验证码 将限定符 client tw ob 添加到查询末尾 这个答案不再一致有效 如果你滥用这个IP地址 你的I
  • 重命名($project)数组中的字段 - MongoDB [重复]

    这个问题在这里已经有答案了 我有一个类似以下的文件 id 59ba903dacea50d0d7d47168 sections id 59d9dd7947ce651544c5d4c1 sectionName Section 1 id 59d9
  • ios7 绘图时出现延迟

    我有一个应用程序 在其中我正在视图上绘制一些草图 到目前为止 在我安装之前它运行良好ios7 我的应用程序使用触摸移动方法来识别运动的变化 但是当我画一条线时 触摸方法被调用 但线不会更新 直到我触摸结束ios7 所以画起来有一点点滞后 它
  • 如何在已实现特征的现有类型的枚举范围内实现特征?

    如何在已实现特征的现有类型的枚举范围内实现特征 我有这个 extern crate pnet use pnet packet ipv4 Ipv4Packet use pnet packet ipv6 Ipv6Packet enum Ethe