Rust 1.19 添加了无标签联合及更多特性

  • Sergio De Simone
  • Rays

2017 年 7 月 27 日

话题:语言 & 开发

Rust 1.19 实现了多个语言上的改进,其中包括无标签联合(Non-tagged Union),及一些新的标准库特性。

在 Rust 中,联合类似于 enums,但是联合是无标签的。这意味着在 Rust 中使用 union 从本质上看是不安全的,因为无可用信息指明实际在用的联合中变量。下面给出一个定义和使用 Rust 联合的例子:

union MyUnion {
    f1: u32,
    f2: f32,
}

let u = MyUnion { f1: 1 };
unsafe { u.f1 = 5 };
let value = unsafe { u.f1 };

fn f(u: MyUnion) {
    unsafe {
        match u {
            MyUnion { f1: 10 } => { println!("ten"); }
            MyUnion { f2 } => { println!("{}", f2); }
        }
    }
}

Rust 中引入联合,不仅使开发人员更易于与暴露联合的 C API 进行接口,而且意在简化那些可节约空间的结构的实现。

在 Rust 1.19 中,现在可以在 loop 表达式中使用 break 并返回值,这在行为上类似于一个表达式。例如:

let x = loop { break 7; };

正如我们前面所提及的,Rust 1.19 在软件库方面也提供了一些新特性。首先,1.19 提供了一对新的宏 eprint! 和 eprintln!,这使得向标准错误写入更为直接,不必再写入到标准输出。

其它新的软件库特性包括:

  • String 现在实现了 FromIterator<Cow<'a, str>> 和 Extend<Cow<'a, str>> 特性。
  • Vec 现在实现了 From<&mut [T]> 特性。
  • Box<[u8]> 现在实现了 From<Box<str>> 特性。
  • SplitWhitespace 现在实现 Clone 特性。

Rust 软件包管理器 Cargo 实现了一些改进。特别是 Cargo 不再为 crates.io 索引而检出本地工作目录,这有助于改进性能并降低注册表的规模。除此以外,改进还包括:build 脚本可以通过修改自身所使用的环境去构建一个 Crate;在使用 --all 时去除指定软件包的新选项 --exclude。

对于已经安装了 Rust 的开发人员,可以使用如下命令更新版本:

rustup update stable

也可以首次使用 rustup 工具去构建它。

如需获取更多的信息,可阅读详细的发行说明。

查看英文原文Rust 1.19 Adds Untagged Unions and More

语言 & 开发