0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何利用Rust过程宏实现derive-with库呢?

jf_wN0SrCdH 来源:Rust语言中文社区 2024-01-25 09:51 次阅读

作用

通过派生宏 #[derive(With)] 给结构体字段生成 with_xxx 方法,通过链式调用 with_xxx 方法来构造结构体。

使用方法

1.给 named struct 每个字段生成 with_xxx 方法

#[derive(With)]
pubstructFoo{
puba:i32,
pubb:String,
}

宏生成代码

implFoo{
pubfnwith_a(mutself,a:implInto)->Self{
self.a=a.into();
self
}
pubfnwith_b(mutself,b:implInto)->Self{
self.b=b.into();
self
}
}

2.给 tuple struct 每个字段生成 with_xxx 方法

#[derive(With)]
pubstructBar(i32,String);

宏生成代码

implBar{
pubfnwith_0(mutself,field_0:implInto)->Self{
self.0=field_0.into();
self
}
pubfnwith_1(mutself,field_1:implInto)->Self{
self.1=field_1.into();
self
}
}

3.通过字段名给 named struct 指定字段实现 with_xxx 方法

#[derive(With)]
#[with(a)]
pubstructFoo{
puba:i32,
pubb:String,
}

宏生成代码

implFoo{
pubfnwith_a(mutself,a:implInto)->Self{
self.a=a.into();
self
}
}

4.通过下标给 tuple struct 指定字段生成 with_xxx 方法

#[derive(With)]
#[with(1)]
pubstructBar(i32,String);

宏生成代码

implBar{
pubfnwith_1(mutself,field_1:implInto)->Self{
self.1=field_1.into();
self
}
}

也支持结构体中含有泛型、生命周期、引用等。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • rust语言
    +关注

    关注

    0

    文章

    57

    浏览量

    3006

原文标题:【大家的项目】利用 Rust 过程宏实现的 derive-with 库

文章出处:【微信号:Rust语言中文社区,微信公众号:Rust语言中文社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何在Rust中连接和使用MySQL数据

    MySQL是一个广泛使用的关系型数据Rust作为一门相对较新的系统级编程语言,具有C语言般的高性能、安全、并发等特性,因此与MySQL一起使用是一种非常有趣的选择。在本教程中,我们将手把手地展示
    的头像 发表于 09-30 17:05 1619次阅读

    如何使用Serde进行序列化和反序列化

    Serde 是一个用于序列化和反序列化 Rust 数据结构的。它支持 JSON、BSON、YAML 等多种格式,并且可以自定义序列化和反序列化方式。Serde 的特点是代码简洁、易于使用、性能高效
    的头像 发表于 09-30 17:09 1254次阅读

    如何使用Rust的标准和structopt来处理控制台参数

    Rust是一种安全、高效的系统编程语言,其标准以及外部提供了很多处理控制台参数的方式。在本篇文章中,我们将分别介绍如何使用Rust的标准
    的头像 发表于 09-20 11:13 1266次阅读

    如何对gcc编译过程中生成的进行调试

    如何对gcc编译过程中生成的进行调试?有哪几种形式?如何对一个函数进行gprof方式的剖析
    发表于 12-24 07:53

    如何利用C语言去调用rust静态

    感觉比较合适。但如果把主要工作切过来,感觉Rust目前又太荒芜了,而且上面的问题也同样存在。尝试了解到Rust可以编译成静态,于是动了只用Rust
    发表于 06-21 10:27

    Rust代码中加载静态时,出现错误 ` rust-lld: error: undefined symbol: malloc `怎么解决?

    “ [i]malloc ”、“ [i]exit ”。我验证了使用 ` [i]nm ` 命令。 问题是我打算使用 ffi 在 rust 中使用这个静态。当我尝试在我的 Rust 代码中加载静态
    发表于 06-09 08:44

    Rust 1.15 引入自定义derive特性有什么做用

    Rust核心团队发布了Rust 1.15稳定版,新增了备受期待的自定义derive特性,让代码生成工具(如Serde和Diesel)能最大效能地工作。
    发表于 05-17 18:05 0次下载
    <b class='flag-5'>Rust</b> 1.15 引入自定义<b class='flag-5'>derive</b>特性有什么做用

    Rust GUI 发展现状

    Rust GUI 发展现状 最近有一篇关于 Rust GUI 的博客,这不,kas 这个  Another GUI toolkit  框架也针对 Rust 的 GUI 框架现状进行了
    的头像 发表于 12-21 15:00 2598次阅读

    Chromium正式开始支持Rust

      Chromium 正式开始支持 Rust 目前的支持只是第一阶段,在C++代码中使用Rust写的第三方(编译成.so)。估计明年Chromium的二进制发行文件中会包含rust
    的头像 发表于 01-14 10:04 944次阅读

    为什么我们从C++语言转向Rust语言

    gtk4-rs代码包含GTK4的Rust crates。还有个庞大的GObject生态系统,其中许多基于gtk-rs中包含的Rust
    的头像 发表于 02-17 17:45 1075次阅读

    基于Rust的Log日志介绍

    了一种简单的方法来实现日志记录,本文将介绍如何使用Rust的Log作为日志门面,并结合env_logger和log4rs两个日志的实战用例进行深入探讨。
    的头像 发表于 09-19 14:49 3403次阅读

    Rust的标准的功能划分

    对于大部分软件开发工程师而言,他们用Rust主要开发应用层软件,也就是运行在用户空间的程序。它们基于标准编写,实现各种业务功能。应用层的软件并非所有模块和函数都涉及到系统调用(例如一些用于操作字符串和处理错误的函数,就无需调用
    的头像 发表于 10-29 17:17 1242次阅读
    <b class='flag-5'>Rust</b>的标准<b class='flag-5'>库</b>的功能划分

    FastTime-纯Rust编写的高并发快速时间

    FastTime, 纯Rust编写的快速时间, 并发: 2800万+/秒. 一、组件
    的头像 发表于 11-06 09:23 602次阅读

    基于Rust的嵌入式符合ACID的键值数据

    surrealkv -- 基于 Rust 的 low level、版本化、嵌入式、符合 ACID 的键值数据
    的头像 发表于 12-28 11:29 862次阅读

    如何用Rust过程魔法简化SQL函数

    这是 RisingWave 中一个 SQL 函数的实现。只需短短几行代码,通过在 Rust 函数上加一行过程,我们就把它包装成了一个 SQL 函数。
    的头像 发表于 01-23 09:43 888次阅读
    如何用<b class='flag-5'>Rust</b><b class='flag-5'>过程</b><b class='flag-5'>宏</b>魔法简化SQL函数<b class='flag-5'>呢</b>?