Rust 1.15 引入自定义 derive 特性

阅读数:875 2017 年 2 月 12 日

话题:开源JavaScript语言 & 开发

Rust 核心团队发布了 Rust 1.15 稳定版,新增了备受期待的自定义 derive 特性,让代码生成工具(如 Serde 和 Diesel)能最大效能地工作。

RFC 1681文档中解释了自定义 derive 的动机:

目前生态系统中的一些大项目,如 Serde 和 Diesel,需要 nightly 版本的 Rust 编译器才可以有效地工作。虽然大多数项目在 Rust 稳定版本上都有替代的方案,但往往不能发挥最大效能,也有自身的一些缺点,而且从经验上来看不能够带来 nightly 版本用户同样的稳定性......

然而,好消息是,这些项目几乎都是由于程序宏的原因而使用 nightly 版本。而且除了自定义 derive 以外,程序宏的全部功能在其他功能中很少使用!更好的消息是,自定义 derive 通常不需要彻底的宏系统所应当具备的一些特性,例如卫生(hygiene)和模块化。正常的程序宏通常具有这些特性。

博文《公布 Rust 1.15》中提供了一个 Diesel 的例子:

// some extern crate and use lines elided here
#[derive(Queryable)]
struct Pet {
    name: String,
}
fn main() {
    use diesel_demo::schema::pets::dsl::*;
    let connection = establish_connection();
    let results = pets
        .limit(5)
        .load::(&connection)
        .expect("Error loading pets");
    println!("Displaying {} pets", results.len());
    for pet in results {
        println!("{}", pet.name);
    }
}

除了自定义 derive,Rust 1.15 的其他改进包括使用 Cargo 重写的构建系统。Rust 团队评论说:

考虑到 Rust 所有的开发都在主分支上,去年 12 月我们开始使用并且运作良好。在一个未关闭的 PR 中完全删除了 Makefile,我们将会在 Rust 1.17 中采纳。它为 rustc 铺平道路,在编译器中可以像其他 Rust 项目一样使用 crates.io 中的包。

在其他重要领域,随着 1.15 稳定版本的发布,Rust 实现了对i686-unknown-openbsdMSP430以及ARMv5TE3 层支持。Hacker News 上关于 Rust 版本发布的讨论中,用户 thenewwazoo评论说“哇!MSP430 的支持是伟大的。也许你不知道,这是一个众所周知的超低功耗单片机...... 这可能是目前唯一一个低于 32 位的平台。我知道支持 8 位 AVR 架构还需要继续努力,但 MSP430 让 Rust 更接近超低功耗应用。”

其他用户对于 Rust 1.15 的发布同样非常兴奋。Dikaiosune,“这是非常重要的。知道这次发布后,我可以删除小型 Web 后端中所有 nightly 版本的功能标志,该 Web 后端中大量使用了类型驱动的代码生成工具(Serde 以及 Diesel)。自定义 derive 拥有稳定性保证,真是太好了。太激动了!”

Ekidd 表示赞同,并补充说,“我们有一堆 Rust 应用程序在工作,只有一个仍然使用 nightly 版本,现在我们也可以把它迁移到稳定版本了。我们可以在其他地方摆脱一堆 build.rs 脚本了,这总是好的。”

Rust1.15 详细的发布说明可以在GitHub上获取,并且可以在这里下载安装包。

查看英文原文:Rust 1.15 Brings Custom Derive


感谢王纯超对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们。