写点什么

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

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

关注

评论

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

Volatile:内存屏障原理应该没有比这篇文章讲的更清楚了

Java 程序员 后端

windows7 本地搭建ELK 收集项目运行日志

Java 程序员 后端

WPF学习——依赖项属性(2)

Java 程序员 后端

ZK(ZooKeeper)分布式锁实现

Java 程序员 后端

Zookeeper(从7个方面来了解Zookeeper基础概念)

Java 程序员 后端

《Spring实战》读书笔记-第4章 面向切面的Spring

Java 程序员 后端

【Java 基础语法】万字解析 Java 的多态、抽象类和接口

Java 程序员 后端

Vue学习之基础入门

Java 程序员 后端

营口市广东商会成立

江湖老铁

YGC问题排查,又让我涨姿势了!

Java 程序员 后端

智能边缘框架Baetyl,为各行业落地实践提供安全机制

百度大脑

人工智能 百度

Win10安装Tomcat服务器与配置环境变量

Java 程序员 后端

ZooKeeper分布式配置——看这篇就够了

Java 程序员 后端

全面通透深入剖析工厂方法模式

Tom弹架构

Java 架构 设计模式

《JVM系列》 第六章 -- 对象的实例化与内存布局(1)

Java 程序员 后端

架构实战营-模块三作业

随风King

「架构实战营」

《代码重构》之方法到底多长算“长”

Java 程序员 后端

《吃透MQ系列》核心基础全在这里了,一文啃透!

Java 程序员 后端

《菜菜的机器学习sklearn课堂》降维算法PCA和SVD

Java 程序员 后端

《重学Java高并发》Disruptor使用实战

Java 程序员 后端

volatile关键字的原理和要避免的误区

Java 程序员 后端

Worktile、Teambition与Tower项目管理软件对比

Java 程序员 后端

“抽象类”到底抽不抽象?实例对比一看便知!

Java 程序员 后端

「并发原理专题」AQS的技术体系之CLH、MCS锁的原理及实现

Java 程序员 后端

《JVM系列》 第六章 -- 对象的实例化与内存布局

Java 程序员 后端

《Spring实战》读书笔记-第4章 面向切面的Spring(1)

Java 程序员 后端

windows 下JDK12的安装过程

Java 程序员 后端

WPF学习——依赖项属性(1)

Java 程序员 后端

WPF学习——依赖项属性(2)(1)

Java 程序员 后端

[译] 微服务的设计模式

Java 程序员 后端

【C 语言小游戏】手打贪吃蛇1

Java 程序员 后端

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