宣布 Rust 1.7

2016 年 3 月 2 日 · Rust 核心团队

Rust 团队很高兴宣布 Rust 的最新版本 1.7。Rust 是一种系统编程语言,专注于安全、速度和并发。

与往常一样,您可以从我们网站上的相应页面安装 Rust 1.7,并在 GitHub 上查看1.7 的详细发行说明。此版本中已合并了大约 1300 个补丁。

1.7 稳定版中的内容

此版本主要关注库功能。虽然我们正在为未来的版本准备一些语言功能,但 1.7 开发的时间范围包括假期,这意味着在 GitHub 上进行评论的时间更少,而与亲人共度的时间更多。

库稳定化

在 1.7 中,大约 40 个库函数和方法现在已稳定。其中一个最大的稳定 API 是对标准库中 HashMap<K, V> 类型中的自定义哈希算法的支持。以前,所有哈希映射都使用SipHash 作为哈希算法,默认情况下提供针对 DOS 攻击的保护。但是,SipHash 在对小键进行哈希时速度并不快。但是,正如所示,FNV 哈希算法 对这些大小的输入速度快得多。这意味着,通过为 HashMap<usize, V> 等类型切换哈希算法,只要可以接受丢失 DOS 保护,就可以显着提高速度。

要查看实际效果,您可以查看 fnv crate(位于 crates.io 上)并通过以下方式创建 HashMap

extern crate fnv;

use std::collections::HashMap;
use std::hash::BuildHasherDefault;
use fnv::FnvHasher;

type MyHasher = BuildHasherDefault<FnvHasher>;

fn main() {
    let mut map: HashMap<_, _, MyHasher> = HashMap::default();
    map.insert(1, "Hello");
    map.insert(2, ", world!");
    println!("{:?}", map);
}

请注意,大多数情况下,您甚至不需要指定哈希器,因为类型推断会处理它,因此 HashMap::default() 应该是您获得高达 2 倍更快哈希所需的一切。还值得指出的是,Hash 特性与使用的哈希算法无关,因此不需要对插入哈希映射中的类型进行任何更改即可获得好处!

其他值得注意的改进包括

  • <[T]>::clone_from_slice(),一种将数据从一个切片复制到另一个切片的高效方法。
  • Ipv4AddrIpv6Addr 上的各种便利方法,例如 is_loopback(),它根据 RFC 6890 返回地址是否为环回地址的 truefalse
  • CString(用于 FFI)的各种改进。
  • 各种数值类型的检查、饱和和溢出操作。这些不计入上面的“40”个数字,因为它们有很多,但它们都做同样的事情。

有关更多信息,请参阅详细的发行说明

Cargo 功能

Cargo 有几个小的更新

  • 对构建脚本的改进,允许它们准确地告知 Cargo 依赖项,以确保它们仅在这些文件更改时重新运行。这应该在包含构建脚本的存储库中对开发有所帮助。
  • cargo rustc 子命令的修改,它允许指定配置文件以在测试等过程中引入开发依赖项。

1.7 的贡献者

我们有 144 个人为 1.7 做出了贡献。非常感谢!

  • Aaron Turon
  • Adam Perry
  • Adrian Heine
  • Aidan Hobson Sayers
  • Aleksey Kladov
  • Alexander Lopatin
  • Alex Burka
  • Alex Crichton
  • Ali Clark
  • Amanieu d’Antras
  • Andrea Bedini
  • Andrea Canciani
  • Andre Bogus
  • Andrew Barchuk
  • Andrew Paseltiner
  • angelsl
  • Anton Blanchard
  • arcnmx
  • Ariel Ben-Yehuda
  • arthurprs
  • ashleysommer
  • Barosl Lee
  • Benjamin Herr
  • Björn Steinbrink
  • bors
  • Brandon W Maister
  • Brian Anderson
  • Brian Campbell
  • Carlos E. Garcia
  • Chad Shaffer
  • Corey Farwell
  • Daan Sprenkels
  • Daniel Campbell
  • Daniel Robertson
  • Dave Hodder
  • Dave Huseby
  • dileepb
  • Dirk Gadsden
  • Eduard Burtescu
  • Erick Tryzelaar
  • est31
  • Evan
  • Fabrice Desré
  • fbergr
  • Felix Gruber
  • Felix S. Klock II
  • Florian Hahn
  • Geoff Catlin
  • Geoffrey Thomas
  • Georg Brandl
  • ggomez
  • Gleb Kozyrev
  • Gökhan Karabulut
  • Greg Chapple
  • Guillaume Bonnet
  • Guillaume Gomez
  • Ivan Kozik
  • Jack O’Connor
  • Jeffrey Seyfried
  • Johan Lorenzo
  • Johannes Oertel
  • John Hodge
  • John Kåre Alsaker
  • Jonas Schievink
  • Jonathan Reem
  • Jonathan S
  • Jorge Aparicio
  • Josh Stone
  • Kamal Marhubi
  • Katze
  • Keith Yeung
  • Kenneth Koski
  • Kevin Stock
  • Luke Jones
  • Manish Goregaokar
  • Marc Bowes
  • Marvin Löbel
  • Masood Malekghassemi
  • Matt Brubeck
  • Mátyás Mustoha
  • Michael Huynh
  • Michael Neumann
  • Michael Woerister
  • mitaa
  • mopp
  • Nathan Kleyn
  • Nicholas Mazzuca
  • Nick Cameron
  • Nikita Baksalyar
  • Niko Matsakis
  • NODA, Kai
  • nxnfufunezn
  • Olaf Buddenhagen
  • Oliver ‘ker’ Schneider
  • Oliver Middleton
  • Oliver Schneider
  • Pascal Hertleif
  • Paul Dicker
  • Paul Smith
  • Peter Atashian
  • Peter Kolloch
  • petevine
  • Pierre Krieger
  • Piotr Czarnecki
  • Prayag Verma
  • qpid
  • Ravi Shankar
  • Reeze Xia
  • Richard Bradfield
  • Robin Kruppe
  • rphmeier
  • Ruud van Asseldonk
  • Ryan Thomas
  • Sandeep Datta
  • Scott Olson
  • Scott Whittaker
  • Sean Leffler
  • Sean McArthur
  • Sebastian Hahn
  • Sebastian Wicki
  • Sébastien Marie
  • Seo Sanghyeon
  • Sergey Veselkov
  • Simonas Kazlauskas
  • Simon Sapin
  • Stepan Koltsov
  • Stephan Hügel
  • Steve Klabnik
  • Steven Allen
  • Steven Fackler
  • Tamir Duberstein
  • tgor
  • Thomas Wickham
  • Thomas Winwood
  • Tobias Bucher
  • Toby Scrace
  • Tomasz Miąsko
  • tormol
  • Tshepang Lekhonkhobe
  • Ulrik Sverdrup
  • Vadim Petrochenkov
  • Vincent Esche
  • Vlad Ureche
  • Wangshan Lu
  • Wesley Wiser