来自 操作系统 2020-03-01 13:16 的文章
当前位置: 澳门威尼斯人平台 > 操作系统 > 正文

Rust 1.38 稳定版发布

Rust 1.40.0 已经正式公布。该版本的亮点富含有 #[non_exhaustive] 和 macros!() and #[attribute]s 的改进。

Rust 1.7 正式通知,Rust 是一个系统一编写程语言,专一于平安,速度和产出。

Rust 1.37.0 stable 有什么?

Rust 1.37.0 的亮点包罗透过项目外号援引枚举变量、内置 cargo vendor、对宏使用未命名的 const、配置文件指点的优化、Cargo 中的 default-run 和枚举上的 #[repr(align(N))] 。

经过品种外号援引枚举变量

在 Rust 1.37.0,能够经过品种别称引用枚举变量。举个例子:

type ByteOption = Option<u8>;

fn increment_or_zero(x: ByteOption) -> u8 {
    match x {
        ByteOption::Some(y) => y + 1,
        ByteOption::None => 0,
    }
}

澳门威尼斯人注册网站 1澳门威尼斯人注册网站 2要实现它,Self 充作类型小名。在 Rust 1.37.0 中,还能利用 Self : Variable 援引枚举变量:

impl Coin {
    fn value_in_cents(&self) -> u8 {
        match self {
            Self::Penny => 1,
            Self::Nickel => 5,
            Self::Dime => 10,
            Self::Quarter => 25,
        }
    }
}

澳门威尼斯人注册网站 3澳门威尼斯人注册网站 4更适用地说,Rust 今后同意通过“type-relative resolution”来援引枚举变量,<MyType<..>>::Variant。

停放 cargo 支持独立注重关系

cargo vendor 命令集成到 Cargo,该命令获取项目标具备注重项,将它们解压缩到 vendor/ 目录中,并展现了在构建进程中应用布满式代码所需的陈设部分。

cargo vendor 已经在生育中采用过超多样处境:Rust 编写翻译器 rustc 使用它在发行版 tarball 中传递它的有所依赖项,而享有 Monorepos 的类型利用它在源代码管理中提交依赖项的代码。

对宏使用未命名的 const

近年来能够创制未命名的 const。相比较给常量八个显式的称谓,只需将其命名叫 _ 。举例,在 rustc 编写翻译器中:

/// Type size assertion where the first parameter
/// is a type and the second is the expected size.
#[macro_export]
macro_rules! static_assert_size {
    ($ty:ty, $size:expr) => {
        const _: [(); $size] = [(); ::std::mem::size_of::<$ty>()];
        //    ^ Note the underscore here.
    }
}

static_assert_size!(Option<Box<String>>, 8); // 1.
static_assert_size!(usize, 8); // 2.

澳门威尼斯人注册网站 5澳门威尼斯人注册网站 6只顾第一个static_assert_size!(..State of Qatar:由于接收了未命名的常量,能够在不命名冲突的图景下定义新项。早前,必要编制static_assert_size!(MY_DUMMY_IDENTIFIER, usize, 8卡塔尔国;。在 Rust 1.37.0,能够更易于地为静态解析指标创造人机工程学和可接受的表明性和进程宏。

布置文件指引的优化(Profile-Guided Optimization

rustc 编写翻译器现在由此 -C profile-generate 和 -C profile-use 标记提供了对计划文件带领优化(PGOState of Qatar的支撑。

Profile-Guided Optimization 允许编写翻译器依照来自实际专门的学问负荷的申报优化代码。它的劳作办法是编写翻译程序,在八个步骤中张开优化:

  1. 先是,程序是用编写翻译器插入的工具构建的。这是通过将 -C profile-generate 标记传递给 rustc 来产生的。然后,必要在示范数据上运转检查实验程序,并将剖判数据写入文件
  2. 今后,重新构建程序,那二遍使用 -C profile-use 标识将搜聚到的剖释数据上报回 rustc。此营造将选用搜聚到的数据,使编写翻译器能够对代码放置、内联和其它优化做出更加好的垄断(monopoly卡塔尔

在 Cargo 项目中甄选暗中认可二进制文件

cargo run 对于急迅测量检验 CLI 应用程序是足以的,当多少个二进制文件出今后同贰个包中时,必得接受 --bin 标识显式表明要运营的二进制文件的称号。那使得 cargo run 不像我们想要的那样相符人机工程学,极其是当一个二进制文件比其他的更频仍地被调用时。

Rust 1.37.0 通过抬高 default-run 来缓和那些难点,那是 Cargo.toml 中的四个新键,当这些键在 [Package] 部分中宣示时,若无传递 --bin 标识,cargo run 将暗中同意为所选的二进制文件。

枚举上的 #[repr(align(N))]

#[repr(align(N))] 属性可用以进步类型定义的对齐性。早先,该属性仅允许在 struct 和 union 中应用。在 Rust 1.37.0,该属性现在也得以用于枚举定义。比如,如下类型 Align16 将如预期的那么,报告 16 为对齐,而不行使 #[repr(align(16))] 的对齐将为 4:

#[repr(align(16))]
enum Align16 {
    Foo { foo: u32 },
    Bar { bar: u32 },
}

澳门威尼斯人注册网站 7澳门威尼斯人注册网站 8在枚举上使用 #[repr(align(N))] 的语义与运用该对齐定义包装器布局体 AlignN<T> 同样 ,然后利用 AlignN<MyEnum>:

#[repr(align(N))]
struct AlignN<T>(T);

澳门威尼斯人注册网站 9澳门威尼斯人注册网站 10在 Rust 1.37.0 中,有一对标准库牢固化:

  • BufReader::buffer 和 BufWriter::buffer
  • Cell::from_mut
  • Cell::as_slice_of_cells
  • DoubleEndedIterator::nth_back
  • Option::xor
  • [{i,u}{8,16,32,64,128,size}::reverse_bits] 和 Wrapping::reverse_bits
  • slice::copy_within

获得 Rust 1.37.0 情势如下:

$ rustup update stable

澳门威尼斯人注册网站 11澳门威尼斯人注册网站 12抑或访谈官方网址获取:

详情见通知表达

(文/开源中夏族民共和国卡塔尔国    

Rust 1.38 早已公布了,Rust 1.38.0 稳固版内容如下:

切实更新内容如下:

能够从官方网站直接安装 Rust 1.7,Rust 1.7 详细更新表明 请看 GitHub 里面的 1300 Patches。

管道编写翻译(pipelined compilation卡塔尔

#[non_exhaustive] 构造,枚举和变体

Rust 1.7 稳固版包涵如何?

假如想要编写翻译 crate,编写翻译器无需完全营造注重项,只要求它们的“元数据”(即类型、信任项、导出的列表卡塔尔(قطر‎,元数据在编写翻译进度早期生成。从 Rust 1.38.0 初叶,Cargo 将基于这一优势,一旦元数据准备伏贴,就自动开头创设信赖的 crate。

当属性#[non_exhaustive]附加到struct或的变体时enum,它将防备定义它的紫翠槐箱外部的代码布局所述struct或变体。为了幸免今后破坏,还幸免其余包装箱在水浇地上拓宽到底相称。以下示例表达了beta在于的失实alpha

此版本首假如 库 天性,同一时间 Rust 团队也在为前程版本增添越来越多的语言特征。

就算这种转换对单个 crate 的编写翻译没有此外影响,但通过测验,获得了有的告知,对于涉嫌多个 crate 的创设,可为干净的和优化的创设带给大致 10~60% 的编写翻译速度 。而别的的改良并非常少,速度的拉长决计于运营营造的硬件。

// alpha/lib.rs:

#[non_exhaustive]
struct Foo {
    pub a: bool,
}

enum Bar {
    #[non_exhaustive]
    Variant { b: u8 }
}

fn make_foo() -> Foo { ... }
fn make_bar() -> Bar { ... }

// beta/lib.rs:

let x = Foo { a: true }; //~ ERROR
let Foo { a } = make_foo(); //~ ERROR

// `beta` will still compile when more fields are added.
let Foo { a, .. } = make_foo(); //~ OK


let x = Bar::Variant { b: 42 }; //~ ERROR
let Bar::Variant { b } = make_bar(); //~ ERROR
let Bar::Variant { b, .. } = make_bar(); //~ OK
                   // -- `beta` will still compile...
  1. 大概 40 个库函数在这里版本达到稳定境况,此中最主要的是明媒正礼库 HashMap<K, V> 类型帮忙自定义 Hash 算法的 APIs;

mem::{uninitialized, zeroed}

背后发生的政工是,#[non_exhaustive] struct或的布局函数的可以预知性enum降低到pub(crate),进而阻碍了在概念它的紫穗槐箱外界举办访谈。

本条变化可以在 crates.io 的 fnv crate 中看出来,也许创造三个 HashMapvia:

从 1.38 伊始,rustc 将为利用 mem::uninitialized 或 mem::zeroed 错误起初化的狭义类提供 lint。

更要紧之处是,#[non_exhaustive]也得以叠合到enum本身上。从规范库中获得的为人师表是Ordering

extern crate fnv;

use std::collections::HashMap;

use std::hash::BuildHasherDefault;

use fnv::FnvHasher;

type MyHasher = BuildHasherDefault;

fnmain(){

             let mutmap:HashMap<_,_,MyHasher> = HashMap::default();

             map.insert(1,"Hello");

             map.insert(2,", world!");

              println!("{:?}",map);

}

#[deprecated] macros

#[non_exhaustive]
pub enum Ordering { Relaxed, Release, Acquire, AcqRel, SeqCst }

此外值得关心的翻新如下:

#[deprecated] 属性最先是在 Rust 1.9.0 版本中引进的。Rust 1.38.0 扩大了品质,允许将其利用于宏,使用 deprecated 属性将宏标志为 deprecated。

#[non_exhaustive]在那上下文中的指标是确认保障能够随时间增添越多变体。这是由此堤防其余包装箱从详尽格局达成match-ing上Ordering。也便是说,编译器将不容:

1. <[T]>::clone_from_slice(卡塔尔,二个快速的数据复制格局,从四个某个到另三个有些

std::any::type_name

match ordering {
    // This is an error, since if a new variant is added,
    // this would suddenly break on an upgrade of the compiler.
    Relaxed | Release | Acquire | AcqRel | SeqCst => {
        /* logic */
    }
}
  1. 提须求 Ipv4Addr 和 Ipv6Addr 种种便利的点子,譬如 is_loopback()

  2. 各种 CString 改进,用于 FFI

  3. 为各个数值类型提供验证,饱和与满溢操作

  4. 更新 Cargo:优化构建脚本,改革 cargo rustc子命令

对于调节和测量试验,获取项指标称谓有的时候是可行的。举例,在通用代码中,你大概希望在运营时看见函数的花色参数被实例化的切切实实项目,此版本能够使用 std::any::type_name 达到这一须求:

代替的是,别的紫翠槐箱须求经过加多通配符来解决越多变体的恐怕性,比如_

Rust 1.7 发行表达:http://blog.rust-lang.org/2016/03/02/Rust-1.7.html 

fn gen_value<T: Default>() -> T {
    println!("Initializing an instance of {}", std::any::type_name::<T>());
    Default::default()
}

fn main() {
    let _: i32 = gen_value();
    let _: String = gen_value();
}
match ordering {
    Relaxed | Release | Acquire | AcqRel | SeqCst => { /* ... */ }
    // OK; if more variants are added, nothing will break.
    _ => { /* logic */ }
}

Rust 1.7 插手的单独进献者有 144 位,特别谢谢:

澳门威尼斯人注册网站 13出口结果:

有关该#[non_exhaustive]属性的更加多详细消息,可参见和睦报告。

Aaron Turon

Initializing an instance of i32
Initializing an instance of alloc::string::String

Macro and attribute 的改进

Adam Perry

澳门威尼斯人注册网站 14澳门威尼斯人注册网站 15库的转移

  • 澳门威尼斯人注册网站,在 type contexts 中调用 procedural macros mac!() 。

Adrian Heine

  • slice::{concat,connect,join} 现在支持 &[T] 和 &T
  • *const T 和 *mut T 未来促成 maker::Unpin
  • Arc<[T]> 和 Rc<[T]> 实现 FormIterator<T>
  • iter::StepBy,Peekble,Take 实现 DoubleEndedIterator

举个例子,客户能够编制以下项目:Foo = expand_to_type!(bar); 其中 expand_to_type 将是三个 procedural macro。

Aidan Hobson Sayers

别的,以下这几个功用已经平稳:

  • Macros in extern { ... } blocks.

Aleksey Kladov

  • Duration::div_duration_f32 和 Duration::div_duration_f64
  • <*const T>::cast 和 <*mut T>::cast
  • Duration::as_secs_f32 和 Duration::as_secs_f64
  • Duration::div_f32 和 Duration::div_f64
  • Duration::from_secs_f32 和 Duration::from_secs_f64
  • Duration::mul_f32 和 Duration::mul_f64 

包括有bang!() macros, 例如:

Alexander Lopatin

赢得 1.38 版本情势如下:

macro_rules! make_item { ($name:ident) => { fn $name(); } }

extern {
    make_item!(alpha);
    make_item!(beta);
}

Alex Burka

rustup update stable

Procedural macro attributes on items in extern { ... } blocks 以往也被支持:

Alex Crichton

澳门威尼斯人注册网站 16澳门威尼斯人注册网站 17端详见公布布告:

extern "C" {
    // Let's assume that this expands to `fn foo();`.
    #[my_identity_macro]
    fn foo();
}

Ali Clark

  • 在 procedural macros 中生成 macro_rules! items

Amanieu d’Antras

(文/开源中国卡塔尔国    

目前,函数式(mac!())和属性(#[mac])macros 都足以调换macro_rules!项目。

Andrea Bedini

  • The $m:meta 匹配器支持 arbitrary token-stream values.

Andrea Canciani

也正是说,以下内容以后有效:

Andre Bogus

macro_rules! accept_meta { ($m:meta) => {} }
accept_meta!( my::path );
accept_meta!( my::path = "lit" );
accept_meta!( my::path ( a b c ) );
accept_meta!( my::path [ a b c ] );
accept_meta!( my::path { a b c } );

Andrew Barchuk

标准库中追加的 const fn

Andrew Paseltiner

此版本中,以下函数成为const fn

angelsl

  • is_power_of_two用于无符号整数

Anton Blanchard

增到规范库的函数

arcnmx

以下函数和宏已经牢固:

Ariel Ben-Yehuda

  • todo!()

  • slice::repeat

  • mem::take

  • BTreeMap::get_key_value 和 HashMap::get_key_value

  • Option::as_deref, Option::as_deref_mut

  • Option::flatten

  • UdpSocket::peer_addr

  • {f32,f64}::to_be_bytes{f32,f64}::to_le_bytes{f32,f64}::to_ne_bytes{f32,f64}::from_be_bytes{f32,f64}::from_le_bytes,和{f32,f64}::from_ne_bytes

arthurprs

实际情况可查阅更新表明:

ashleysommer

Barosl Lee

(文/开源中夏族民共和国卡塔尔(قطر‎    

Benjamin Herr

Björn Steinbrink

bors

Brandon W Maister

Brian Anderson

Brian Campbell

本文由澳门威尼斯人平台发布于操作系统,转载请注明出处:Rust 1.38 稳定版发布

关键词: