【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

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

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

关注

评论

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

探索ChatGPT技术在文本生成、机器翻译领域的简单应用 | 社区征文

兴科Sinco

人工智能 机器翻译 OpenAPI openai ChatGPT

演讲实录|AI 数据库的内存优化之路

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

阿里内网「MySQL面试小册」,简直太香了!

做梦都在改BUG

Java MySQL 数据库 面试

直播预告 | 倒计时一天,博睿数据联合统信软件同心生态联盟举办金融信创应用实践线上直播

博睿数据

可观测性 直播 智能运维 博睿数据 金融信创

bucket表:数仓存算分离中CU与DN解绑的关键

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 3 月 PK 榜

科技和女性的今天,《赛博格宣言》半个世纪前就预言了

脑极体

赛博格 女性

Meta Force佛萨奇2.0合约开发系统源码部署

薇電13242772558

智能合约

秒懂算法 | DP概述和常见DP面试题

TiAmo

算法 DP算法

2023两会看点:SaaS

ToB行业头条

数字化转角,遇见未来新模式

鼎道智联

2023年2月国产数据库大事记-墨天轮

墨天轮

数据库 opengauss TiDB oceanbase 国产数据库

瓴羊Quick BI真心不错,已获得官方认可!

对不起该用户已成仙‖

MASA MAUI Plugin (十)iOS消息推送(原生APNS方式)

MASA技术团队

blazor MASA MAUI Xamarin

携程 x TiDB丨应对全球业务海量数据增长,一栈式 HTAP 实现架构革新

PingCAP

数据库 TiDB

瓴羊Quick BI数据大屏真不错,优势尽显!

流量猫猫头

如何判断多账号是同一个人?用图技术搞定 ID Mapping

NebulaGraph

图数据库 风险控制 安全控制

如何规范 RESTful API 的业务错误处理

江湖十年

Go 后端 Error RESTful API

从小程序容器和微服务架构的结合,看未来应用程序开发的主流方式

没有用户名丶

博睿“她”力量 :这份专业值得信赖

博睿数据

博睿数据 节日祝福

“中国的ChatGPT”真的要来了吗?

科技热闻

百度智能云首批通过信通院MLOps旗舰级评测 全面加速文心一言产业落地

Geek_2d6073

CNStack 助推龙源电力扛起“双碳”大旗

阿里巴巴云原生

阿里云 云原生 CNStack

美团二面:Redis 究竟是单线程还是多线程?

做梦都在改BUG

Java 数据库 redis 缓存 单线程

车载小程序发展现状:使用环境、用户体验、应用场景及未来趋势

没有用户名丶

小程序化

CNStack 多集群服务:基于 OCM 打造完善的集群管理能力

阿里巴巴云原生

阿里云 云原生 kubenetes 集群管理

ChatGPT 未来发展趋势 | 社区征文

魏铁锤

ChatGPT

IoT物联网设备OTA固件升级开发实践——设备管理运营类

阿里云AIoT

物联网

大咖说·阿里研究院|数实融合的第三次浪潮

大咖说

3 月 9 日「融云 2023 政企数智办公新品巡展 · 北京站」邀您入席!

融云 RongCloud

产品 数字化 政企

直播预约丨 微服务x容器开源开发者 Meetup 北京站回顾 & PPT 下载

阿里巴巴云原生

阿里云 容器 微服务 云原生

开放下载丨云原生架构容器&微服务优秀案例集

阿里巴巴云原生

阿里云 容器 微服务 云原生

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