写点什么

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

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

关注

评论

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

redis--多机

en

redis 高可用

网络安全漏洞深度剖析

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

央行数字货币即将破茧,一场大变局,震撼全球

CECBC

未来已来,运营商如何驱动区块链应用创新提速?

CECBC

博鳌亚洲论坛国际科技与创新论坛第二届大会区块链分论坛紧密筹备中

时空云

区块链 博鳌 亚洲论坛

filecoin矿机分币系统开发方案(现成)

Go应用场景与适应项目

hanaper

人工智能解决方案 --- 智能运维(AIOps)

micklongen

人工智能 AIOPS 知识图谱 智能运维 数据工程

IPFS算力挖矿系统开发方案(源码案例)

站立会(Daily Scrum)我们说些什么

Bruce Talk

Scrum 敏捷 Agile Coach/Facilitate

越来越被需要的售前工程师·「这就是售前」前言

jiezhao

售前 企业服务

fil挖矿分币系统开发资料(案例)

跳槽时需要注意的事项

石云升

跳槽 职场经验 10月月更

Minio环境搭建

Fox666

Minio 分布式文件存储

分布式文件存储系统Minio实战

Fox666

Minio 分布式文件存储

IPFS云矿机分币软件系统开发简介(源码)

Java 面试八股文之数据库篇(一)

Dobbykim

现成filecoin算力挖矿软件系统开发公司

IPFS分币挖矿系统软件开发资料(现成)

现成IPFS分布式存储矿机软件系统开发案例

微信小程序获取用户授权的思路

Changing Lin

10月月更

linux【redhat&ubuntu】下ffmpeg-3.1安装编译及视频转码

程序员架构进阶

架构 ffmpeg 视频流 10月月更

018云原生之基础架构

穿过生命散发芬芳

云原生 10月月更

Java容器学习二

风翱

Java 10月月更

FIL云算力分币软件系统开发内容(源码)

Large Scale Distributed Deep Networks论文记录

春秋易简

丰收音乐会,去找美丽却隐秘的生机

E科讯

小红书爆款笔记如何写,掌握3种类型的笔记写法

石头IT视角

手机影像二十载,AI多摄会是终极答案吗?

脑极体

趣说 Node.js 的事件循环

Regan Yue

node.js Regan Yue 10月月更

区块链将规则写入代码 重构市场新制度

CECBC

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