Rust的最新版本1.30扩展了过程宏,允许它们定义新的属性和类似于函数的宏。此外,它简化了Rust模块系统,使其更加一致、直观。

Rust 1.30引入了两种新类型的过程宏,“类属性的过程宏”和“类函数的过程宏”。过程宏是Rust元编程的基础,支持操作程序语法树。在这方面,过程宏要比声明宏强大得多,声明宏提供了一种机制来定义基于模式匹配的更复杂代码的简写。

类属性过程宏类似于现有的派生宏,但是更灵活,因为它们允许你创建新的属性,并且除了结构和枚举之外,还可以应用于函数。例如,一个属性宏可以实现route属性规范,定义HTTP路由:

// 使用路由过程宏#[route(GET, \u0026quot;/\u0026quot;)]fn index() { ...}// 过程宏定义路由#[proc_macro_attribute]pub fn route(attr: TokenStream, item: TokenStream) -\u0026gt; TokenStream {  // attr接收GET,宏的\u0026quot;/\u0026quot;部分  // item接收fn index () { ...}

类似地,类函数过程宏允许你定义类似于函数的宏,例如:

// 解析SQL语句let sql = sql!(SELECT * FROM posts WHERE id=1);#[proc_macro]pub fn sql(input: TokenStream) -\u0026gt; TokenStream {

在这两个示例中,TokenStream都表示应用属性的语法树或属性/函数定义。route/sql函数将接收到的语法树转换为返回给调用者的新语法树,即生成要执行的新代码。

在使用Rust模块系统时,Rust 1.30还对use宏进行了一些修改,以提升开发人员的体验。首先,use现在可以引入宏定义,从而淘汰了macro_use注解:

// 旧:#[macro_use]extern crate serde_json;// 新:extern crate serde_json;use serde_json::json;

此外,通过把所有对名称空间的引用都与prelude模块中包含的所有extern crate指令进行比较,并使用匹配的那个,使得外部Crates对于在模块层次结构中移动的函数具有更强的适应性。以前,必须显式地在模块内部使用extern或者使用::extern_name语法,如下例所示:

extern crate serde_json;fn main() {    let json = serde_json::from_str(\u0026quot;...\u0026quot;); // OK}mod foo {    // 为在模块种使用serde_json,必须显式使用use    use serde_json;    fn bar() {        let json = serde_json::from_str(\u0026quot;...\u0026quot;);    }    fn baz() {      // 也可以使用外部模块的完整限定名      let json = ::serde_json::from_str(\u0026quot;...\u0026quot;);    }

最后,use现在以更加一致的方式解释模块路径。现在,你可以使用crate关键字来表明你希望模块路径从crate根路径开始。在1.30版本之前,这是默认的模块路径,但是,直接引用项的路径将从本地路径开始:

mod foo {    pub fn bar() {        // ...    }}mod baz {    pub fn qux() {            // 旧        ::foo::bar();        // 无效,这和使用“use”不同:        // foo::bar();        // 新        crate::foo::bar();    }}

Rust 1.30还带来了如下变化:

  • 你现在可以通过加上前缀r#把关键字作为标识符,例如r#for。这种变化主要是因为Rust 2018将引入新的关键词,这样一种机制应当可以用于转换使用这些关键字作为变量或函数名的现有代码。
  • 借助no_std,你现在可以构建应用程序而不使用标准库。以前,由于无法定义panic_handler,所以你只能使用no_std构建库。

你可以使用$ rustup update stable更新Rust分发包。关于Rust 1.30的完整细节,请查阅发布说明。

查看英文原文:Rust 1.30 Brings More Metaprogramming Support and Improved Modules

Rust 1.30带来更多元编程支持,并改进了模块系统相关推荐

  1. Qt 5.14 稳定版发布,带来更好的 HiDPI 支持和改进 3D 模块

    计划于上个月发布的 Qt 5.14 经过短暂的推迟后,现在终于发布了稳定版.该版本以及明年的 Qt 5.15 LTS 开始为发布 Qt 6 做铺垫.开发团队表示,尽管他们正在努力通过标记不推荐使用的功 ...

  2. 3D应用无需下载即点即用,云应用带来更轻量的元宇宙

    最近一个程序员朋友告诉我,公司市场部想做一个元宇宙相关的互动游戏,于是给技术团队提了一个带用户线上沉浸式环游园区的H5开发需求.他摸着所剩无几的头发据理力争:这个需求真的做不了! 我听了很疑惑,现在许 ...

  3. 中学编程_您可以从30岁的第一次编程采访中学到什么

    中学编程 by Sean Choi 通过蔡恩 您可以从30岁的第一次编程采访中学到什么 (What you can learn from a 30-year-old's first coding in ...

  4. Google VS Facebook,哪个能带来更好的效果?

    众所周知,Facebook 和 Google 是目前最受欢迎的两个广告平台.这两个平台都拥有数十亿用户和海量数据集,可帮助公司将广告展示在意向客户面前. 作为搜索引擎的 Google 和社交媒体平台的 ...

  5. GitHub趋势榜第一:超强PyTorch目标检测库Detectron2,训练更快,支持更多任务

    栗子 发自 凹非寺 量子位 报道 | 公众号 QbitAI PyTorch目标检测库Detectron2诞生了,Facebook出品. 站在初代的肩膀上,它训练比从前更快,功能比从前更全,支持的模型也 ...

  6. AIoT原生技术带来更好的应用开发

    简介:共论云原生! 在10月22日举行的云栖AIoT原生技术与实践峰会上,来自阿里云IoT与机械九院等机构的专家们,分享了如何利用AIoT原生技术带来更好的应用开发,让垂直行业的开发者不再担心基础设施 ...

  7. 4款良心电脑软件,有两款虽已停更,依然支持免费使用

    闲话少说,直奔主题 1.小丸工具箱(视频压缩神器) 这是一款视频压缩神器,它支持几乎所有格式的视频压缩,完全免费.无广告,虽已停更6年,仍被众多网友推荐,全凭极致体验与口碑. 小丸工具箱操作非常简单, ...

  8. 新款智能枕头为人们的生活带来更佳体验

    由于当代人们生活节奏加快,所以脱发和失眠都是人们常常谈及的问题,脱发问题尚且可以通过各种手段缓解,但是失眠有可能会对人们的身体健康产生重大的影响,而为了缓解人们的失眠问题和改善人们的睡眠质量,智能枕头 ...

  9. WasmEdge 0.9.1 发布:更佳 networking 支持与开发者体验、安卓支持

    WasmEdge 0.9.1 发布! 更好的 networking 支持与开发者体验.安卓支持 WasmEdge 0.9.1 发布了!此版本集成了高性能 networking.JavaScript 流 ...

最新文章

  1. golang 使用 protobuf 的教程
  2. Boost.MultiIndex 复合键的例子
  3. 关于oracleblob字段的用到
  4. 无线路由器的WDS功能如何配置?
  5. linux 保留最近目录,Linux如何删除全部目录只保留最新修改的目录
  6. Dart基础-变量与类型
  7. Number()、parseInt() 和 parseFloat() 的区别
  8. “上班那点儿事交流圈”发展计划
  9. Android系统信息获取 之四:系统语言信息获取
  10. Linux文件传输与mysql数据库安装
  11. tkinter 菜单添加事件_简洁又好用的导航网站添加了自定义导航功能
  12. 【平面设计基础】11:配色——配色原理
  13. SMD和SMT的区别
  14. sqlalchemy 8 会话 与 异常
  15. Keil V5.37.0.0 - 按 F12 无法跳转到定义
  16. 第四篇:ROS常用命令行指令【重点】
  17. opencv4.1无法加载python-cnn模型,编译第三方库libtensorflow_cc.so巨坑
  18. DataBinding找不到符号,import xxx.xxx.ActivityxxxBindingImpl
  19. Python列表去重顺序不变
  20. 像李云迪那样爱 IT界那些“情”

热门文章

  1. iOS开发者帐号申请指南
  2. QQ拼音在中文输入下默认英文标点
  3. 博客园 cnblogs博客添加Google Analytics统计
  4. VS2005 制作安装程序的一些网络教程
  5. K8S的横向自动扩容的功能Horizontal Pod Autoscaling
  6. Windows 7 64位机上OpenCV2.4.3的编译、安装与配置
  7. 【Qt】Ubuntu18.04下解决Qt出现qt.qpa.plugin:Could not load the Qt platform plugin “xcb“问题
  8. 计算机组成原理实验pc,计算机组成原理实验报告5- PC实验
  9. mysql 5.6 uf8mb4_MySQL5.7升级到8.0过程详解
  10. php 5.2 模块路径,5.2 模块和操作