把握行业变革关键节点,12 月 19 日 - 20 日,AICon北京站即将重磅启幕! 了解详情
写点什么

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

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

关注

评论

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

《深度工作》学习笔记(3)

石云升

学习 深度工作 工作哲学

ARTS打卡 第10周

引花眠

ARTS 打卡计划

架构师训练营第八章-作业1

A Matt

第九周

hdhdh

系统设计系列之如何设计一个短链服务

看山

架构 面试 分布式 架构设计 短链服务

什么?不写代码也能做功能开发! -RUOYI 教程二

Java_若依框架教程

Java 无代码开发 若依

计算机网络基础(十一)---网络层-OSPF协议

书旅

计算机网络 网络 协议栈 OSPF

云小课 | IPv4枯了,IPv6来了

华为云开发者联盟

IP 公有云 虚拟私有云 华为云 虚拟化

秒杀系统问题与方案设计

superman

秒杀 架构总结

智能膜切机,解决手机贴膜行业难题

Geek_116789

Vue中使用装饰器,我是认真的

前端有的玩

Java Vue 装饰器

你问我答:微服务治理应该如何去做?

BoCloud博云

容器 微服务 PaaS API 博云

华为云GaussDB(DWS)内存知识点,你知道吗?

华为云开发者联盟

数据库 大数据 数据 内存 华为云

数据库系统设计概述

码哥字节

数据库 redis mongodb elasticsearch 数据库设计

手写一个重入锁

诸葛小猿

synchronized CAS 重入锁 compareAndSwap ReentrantLock

英特尔®AI计算盒参考设计发布 加速智能边缘崛起

最新动态

JVM系列之:JIT中的Virtual Call

程序那些事

Java JVM JIT

实用!一键生成数据库文档,堪称数据库界的Swagger

程序员小富

Java MySQL

基于 Golang的侵入式 Opentracing实现全链路追踪 ----实践篇

是老郭啊

老哥,您看我这篇Java集合,还有机会评优吗?

苹果看辽宁体育

Java 后端

Newbe.Claptrap 框架如何实现多级生命周期控制?

newbe36524

架构 微服务 .net core ASP.NET Core

数据人必须知道的SQL概念(A—Z)

大唐小生

sql 数据 职场成长

将信将疑,将中台进行到底

郭华

初识分布式:MIT 6.284系列(一)

Kerwin

分布式 MIT 28天写作

<<前端进阶篇>> PDF 出炉了 — 「阿宝哥」,精心准备的 6 万多字 170 页的前端进阶资料

阿宝哥

大前端

技术管理者带团队的几个实用技巧

Phoenix

团队管理 企业文化 团队 价值观

飞天茅台超卖事故:Redis分布式锁请慎用!

程序员生活志

redis 分布式

授人以渔:stm32资料查询技巧

华为云开发者联盟

架构 armv8 芯片 华为云 二进制

财务分析与主要的模型

金松(李博源)

微软苏州集体抵制来自阿里、华为的跳槽者:请停止你的“奋斗逼”行为!网友:看到 955 不加班的公司名单,我酸了

程序员生活志

程序员 加班 996

在人工智能时代追逐的“后浪”

华为云开发者联盟

程序员 AI 开发者 技术社区 华为云

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