2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

  • 2018-11-15
  • 本文字数:1385 字

    阅读完需:约 5 分钟

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

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


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


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


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

复制代码


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


// 解析SQL语句let sql = sql!(SELECT * FROM posts WHERE id=1);
#[proc_macro]pub fn sql(input: TokenStream) -> 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("..."); // OK}
mod foo {
// 为在模块种使用serde_json,必须显式使用use use serde_json;
fn bar() { let json = serde_json::from_str("..."); }
fn baz() { // 也可以使用外部模块的完整限定名 let json = ::serde_json::from_str("..."); }

复制代码


最后,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


2018-11-15 07:152336
用户头像

发布了 1008 篇内容, 共 442.8 次阅读, 收获喜欢 346 次。

关注

评论

发布
暂无评论
发现更多内容

基于迁移学习的非侵入式负荷识别

白日梦

Java基础重要面试题(一)

逆锋起笔

java面试 java基础 3月月更

22.04 LTS爆料现场 - UKUI 3.1实操界面曝光,简约却不简单!

优麒麟

Linux 开源 操作系统 优麒麟 UKUI

干货|一次完整的性能测试,测试人员需要做什么?

云智慧AIOps社区

测试 性能测试 测试 单元测试 测试类型 测试管理

免费下载 |《Serverless 开发速查手册》让你速查秒懂 Serverless

阿里巴巴云原生

云原生

阿里巴巴发布最佳实践 | 阿里巴巴DevOps实践指南

阿里云云效

云计算 阿里云 DevOps 云原生 迭代管理

什么是 RabbitMQ

Ayue、

RabbitMQ 3月月更

camtasia studio2022更新内容介绍

茶色酒

LabVIEW设计自定义指示灯和按钮控件

不脱发的程序猿

LabVIEW 自定义控件方法

面试突击30:线程池是如何执行的?拒绝策略有哪些?

王磊

java面试

微博系统中”微博评论“的高性能高可用计算架构

孙强

架构师实战营

Nginx 反向代理(二)

神农写代码

基于微信小程序的驾校预约学车平台的概要设计和详细设计

CC同学

大数据培训:HiveSQL技术优化与面试

@零度

Hive SQL 大数据开发

To程序员:要写出好代码,你需要懂点儿“底层思维”

博文视点Broadview

Qunar【业务架构解析与探索】系列课重磅来袭啦!!

Qunar技术沙龙

架构

Nginx反向代理(三)

神农写代码

CRM复杂业务场景的低代码开发实践

鲸品堂

低代码

浏览器中的页面

Tristan

遵循Promises/A+规范,手把手带你实现Promise源码(核心篇)

战场小包

JavaScript 前端 Promise 3月月更

StarRocks 2.1 新版本特性介绍

StarRocks

数据库 大数据 StarRocks

AQS 源码流程分析

网易云信

java

PendingIntent重定向:一种针对安卓系统和流行App的通用提权方法——BlackHat EU 2021议题详解(上)

安第斯智能云

安全 安卓

Redis集群架构剖析(1):认识cluster

非晓为骁

redis redis cluster 分布式,

Python 中的函数式编程三大法宝:map、filter、reduce

踏雪痕

Python map reduce 3月程序媛福利 3月月更

Nginx反向代理(一)

神农写代码

Web 键盘输入法应用开发指南 (8) —— 模拟事件

天择

JavaScript 键盘 输入法 3月月更

硬件工程师实用工具网站

不脱发的程序猿

嵌入式 智能硬件 电路设计 硬件工程师 实用工具网站

我们不太可能一直存在着失控的人生,我们要做的是,让拥有自控力的时间长一点,让失控的日子短一点。

叶小鍵

智慧停车场-车牌识别自动计费系统

DS小龙哥

车牌识别 3月月更

Linux下玩转nginx系列(三)---nginx日志配置文件说明

anyRTC开发者

nginx Linux 音视频 WebRTC 服务器

Rust 1.30带来更多元编程支持,并改进了模块系统_编程语言_Sergio De Simone_InfoQ精选文章