微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法自动为许多结构实现相同的功能?

如何解决有没有办法自动为许多结构实现相同的功能?

如您所见,以下所有类型都具有相同的结构:

type Response = rtsp_types::Response<Body>;

struct PlayResponse(Response);
struct DescribeResponse(Response);
struct SetupResponse(Response);
struct PauseResponse(Response);
struct TeardownResponse(Response);
struct RecordResponse(Response);
struct UnauthorizedResponse(Response);

我想为他们做同样的实现:

impl From<Response> for PlayResponse {
    fn from(response: Response) -> Self {
        PlayResponse(response)
    }
}

impl From<Response> for DescribeResponse {
    fn from(response: Response) -> Self {
        DescribeResponse(response)
    }
}

//...

但我不想重复。

我知道我可以对所有这些进行枚举,但是由于太大的原因无法放在这里,因此该解决方案不适用于我的问题。

为所有这些结构实现 From 的最佳方法是什么,就像我做的示例实现一样?宏?没有办法在 T 上做一个通用的实现吗?

解决方法

您可以使用 duplicate 板条箱轻松完成此操作:

use duplicate::duplicate_inline;

type Response = rtsp_types::Response<Body>;

duplicate_inline!{
    [
        Name;
        [PlayResponse];
        [DescribeResponse];
        [SetupResponse];
        [PauseResponse];
        [TeardownResponse];
        [RecordResponse];
        [UnauthorizedResponse];
    ]
    struct Name(Response);
    impl From<Response> for Name {
        fn from(response: Response) -> Self {
            Name(response)
        }
    }
}

这将声明每个结构及其实现,用 Name 替换每个结构的名称。

,

传统的方法只是制作一个声明性宏,为您的各种类型实现 From

type Response = rtsp_types::Response<Body>;

struct PlayResponse(Response);
struct DescribeResponse(Response);
struct SetupResponse(Response);
struct PauseResponse(Response);
struct TeardownResponse(Response);
struct RecordResponse(Response);
struct UnauthorizedResponse(Response);

macro_rules! impl_from_response {
    ($t:ident) => {
        impl From<Response> for $t {
            fn from(response: Response) -> Self {
                $t(response)
            }
        }
    }
}

impl_from_response!(PlayResponse);
impl_from_response!(DescribeResponse);
impl_from_response!(SetupResponse);
impl_from_response!(PauseResponse);
impl_from_response!(TeardownResponse);
impl_from_response!(RecordResponse);
impl_from_response!(UnauthorizedResponse);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?