写点什么

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:152027
用户头像

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

关注

评论

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

Struct embedding in Go

Interstate5

time.Time dynamodb apigateway Go 语言

毕业三年了,我开始明白为什么说三年是一个坎

鄙人薛某

程序员 程序人生 职场回顾

redis系列之——分布式锁

诸葛小猿

Java redis 分布式 分布式锁

阿里四面你都知道吗?

root

Java 程序员 互联网 阿里 简历

Scala中如何优雅地实现break操作

吴慧民

scala

统一物品编码破解追溯“断链”困局

CECBC

架构师训练营-作业5

紫极

为了把握新基建风口,科技公司都在紧密筹备这件事...

极客时间企业版

typora设置图片自动上传,实现快速发文章

诸葛小猿

Typora PicGo gitee 上传图片

鲲鹏说:高考之路你们走,高考阅卷我来守

脑极体

这样的二维码,你见过吗?

诸葛小猿

Java Python 后端 二维码 myqr

聊聊Spring的IOC以及JVM的类加载

小隐乐乐

技术选型课程小结

梅子黄时雨

极客大学架构师训练营

如何学习Visual Studio Code

博文视点Broadview

学习 读书笔记 vscode 能力提升 编辑器

信创舆情一线--5省发布区块链发展计划

统小信uos

区块链 舆情

人生就是体会矛盾的过程

封不羁

成长 感悟

Hadoop大数据存算分离下,如何解决新旧存储共存?

XSKY星辰天合

啃碎并发(七):深入分析Synchronized原理

猿灯塔

Java

Newbe.Claptrap 框架入门,第一步 —— 创建项目,实现简易购物车

newbe36524

Docker Reactive ASP.NET Core

kubernetes集群安装(二进制)

小小文

Kubernetes 容器

如何通过DDD构建一辆汽车

冯文辉

领域驱动设计 DDD

依旧乐观的李彦宏,十年寻光的百度AI

脑极体

数据分析师成长体系漫谈-数仓模型设计

analysis-lion

学习 数据仓库 数据分析 随笔杂谈

开发者必备——API设计问题

Noneplus

ArrayList源码阅读

慌张而黑糖

ArrayList 源码阅读

数据库分片

Axe

CORS 和 CSRF 修炼宝典

Geek_z9ygea

大前端 Web CORS CSRF

golang内存对齐

PONPON

go内存对齐 Go 语言

华为云FusionInsight MRS通过信通院大数据能力评估 单集群突破2万+规模

数据湖洞见

大数据 FusionInsight MRS 华为云

分布式缓存与消息队列

紫极

架构师训练营第六周总结

Melo

极客大学架构师训练营

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