50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

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

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

关注

评论

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

查看mac电脑的温度信息, 并且给mac电脑降温

lmymirror

macos Mac terminal

关于深浅拷贝

西贝

Java 大前端 基础

Electron 快速入门及最新安装教程

程序员学院

Java html 大前端 Electron node,js

奈学开发者社区分享:Java - 设计模式的7个设计原则

古月木易

Java 设计模式

奈学开发者社区分享:Java - 设计模式的7个设计原则

奈学教育

Java 设计模式 设计原则

深入理解MySQL中事务隔离级别的实现原理

X先生

MySQL 数据库 后端 事务

架构1期第三周作业一

道长

极客大学架构师训练营

关于互联网留存和收益你知道多少—带你走近用户成长体系

滴滴普惠出行

实践分享丨物联网操作系统中的任务管理

华为云开发者联盟

华为 数据 物联网 进程

数字货币是大势所趋,新冠疫情后必须率先发展DCEP

CECBC

数字货币 银行

公有云厂商哪家强?本月UCloud、百度云、阿里云位居三甲——2020年8月云主机性能评测排名

博睿数据

戴尔G系列游戏本助玩家激战英特尔大师挑战赛

E科讯

融云技术分享:基于WebRTC的实时音视频首帧显示时间优化实践

JackJiang

音视频 即时通讯 实时通信

华为全联接2020:环信AI领跑,输出5大行业最佳实践

DT极客

三年筑一“用”:长跑中的智能IP网络

脑极体

一文纵览向量检索

华为云开发者联盟

数据 搜索 检索 检查

区块链会替代大数据吗?

CECBC

区块链 大数据

PPT画成这样,述职答辩还能过吗?

小傅哥

Java 小傅哥 流程图 架构师 PPT

牛皮!应届生面试阿里Java岗,七轮过后定级P6,薪资44.8W

面试 计算机基础 编程开发 架构师技能

中国Prime会员独享巅峰64小时超长跨境网购时间

爱极客侠

Binder那么弱怎么面大厂?

博文视点Broadview

Java android 通信 移动开发 Android进阶

一文领略 HTTP 的前世今生

yes

互联网 网络 HTTP 阿帕网

一个草根的日常杂碎(9月28日)

刘新吾

随笔杂谈 生活记录 社会百态

for-range造就循环永动机?快来看看go中for-range的那些事!

Gopher指北

后端 for Go 语言

大学四年我是怎么写操作系统和计算机网络的?掏心掏肺的分享!

小林coding

学习 程序员 计算机网络 操作系统 计算机基础

bug 回忆录(一)

志学Python

一个草根的日常杂碎(9月27日)

刘新吾

随笔杂谈 生活记录 社会百态

初学源码之——银行案例手写IOC和AOP

Java架构师迁哥

第 0 次面试

escray

程序员 面试 面经

世界的下一个主宰——人工智能

CECBC

人工智能 智能时代

H5选图预览到上传最佳实践

阿里云金融线TAM SRE专家服务团队

android H5

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