Rust 1.39.0 发布,async/.await 终于稳定了
时间:2019-11-15 10:11 来源:linux.it.net.cn 作者:IT
Rust 1.39.0 已经发布。此版本的亮点包括 async/.await,对 match 守卫 by-move 绑定的共享引用,以及函数参数的属性。
async/.await 稳定
此版本 async/.await 特性已经稳定,这意味着现在可以定义 async 函数和块,并进行 .await 操作。
async 函数通过 async fn 引入,被调用时会返回一个 Future,该 Future 是一个会挂起的计算,可以使用 .await 运行并完成计算。而除了 async fn,async{...} 和 async move{...} 块也可以用来定义“异步文字”,它们的行为像闭包。
match 守卫引用 by-move 绑定
在 Rust 中进行模式匹配时,一个变量,也就是“绑定”,可以通过以下方式界定:
-
不可更改或可变地 by-reference。这可以通过诸如ref my_var或ref mut my_var分别明确地实现,在大多数情况下,绑定模式将自动推导。
-
by-value,或者当绑定变量的类型实现 Copy 时 by-copy,否则 by-move。
以往,Rust 将禁止在表达式的保护结构中共享对 match 表达式中 if 守卫的 by-move 绑定的引用,这意味着以下代码将被拒绝:
fn main() {
let array: Box<[u8; 4]> = Box::new([1, 2, 3, 4]);
match array {
nums
// ---- `nums` is bound by move.
if nums.iter().sum::<u8>() == 10
// ^------ `.iter()` implicitly takes a reference to `nums`.
=> {
drop(nums);
// ----------- `nums` was bound by move and so we have ownership.
}
_ => unreachable!(),
}
}
Rust 1.39 中,上面的代码段现在已被编译器接受,此特性可以为整体的 match 表达式带来更流畅、更一致的体验。
函数参数的属性
现在允许在函数、闭包和函数指针的参数上使用属性。
比如以往这样编写:
#[cfg(windows)]
fn len(slice: &[u16]) -> usize {
slice.len()
}
#[cfg(not(windows))]
fn len(slice: &[u8]) -> usize {
slice.len()
}
现在可以以更简洁的方式:
fn len(
#[cfg(windows)] slice: &[u16], // This parameter is used on Windows.
#[cfg(not(windows))] slice: &[u8], // Elsewhere, this one is used.
) -> usize {
slice.len()
}
这里可以使用的属性包括:
-
条件编译:cfg 和 cfg_attr
-
控制 lint:allow、warn、deny 与 forbid
-
应用于项目的过程宏属性使用的帮助程序属性
这在整个语言生态中提供了一个更具可读性的基于宏的 DSL。
标准库中增加的 const fn
此版本中,以下函数成为 const fn:
-
Vec::new、String::new 与 LinkedList::new
-
str::len、[T]::len 与 str::as_bytes
-
abs、wrapping_abs 与 overflowing_abs
增加到标准库的函数
以下函数已经稳定:
-
Pin::into_inner
-
Instant::checked_duration_since 与 Instant::saturating_duration_since
详情查看更新说明:
https://blog.rust-lang.org/2019/11/07/Rust-1.39.0.html
(责任编辑:IT)
Rust 1.39.0 已经发布。此版本的亮点包括 async/.await,对 match 守卫 by-move 绑定的共享引用,以及函数参数的属性。 async/.await 稳定 此版本 async/.await 特性已经稳定,这意味着现在可以定义 async 函数和块,并进行 .await 操作。 async 函数通过 async fn 引入,被调用时会返回一个 Future,该 Future 是一个会挂起的计算,可以使用 .await 运行并完成计算。而除了 async fn,async{...} 和 async move{...} 块也可以用来定义“异步文字”,它们的行为像闭包。 match 守卫引用 by-move 绑定 在 Rust 中进行模式匹配时,一个变量,也就是“绑定”,可以通过以下方式界定:
以往,Rust 将禁止在表达式的保护结构中共享对 match 表达式中 if 守卫的 by-move 绑定的引用,这意味着以下代码将被拒绝: fn main() { let array: Box<[u8; 4]> = Box::new([1, 2, 3, 4]); match array { nums // ---- `nums` is bound by move. if nums.iter().sum::<u8>() == 10 // ^------ `.iter()` implicitly takes a reference to `nums`. => { drop(nums); // ----------- `nums` was bound by move and so we have ownership. } _ => unreachable!(), } } Rust 1.39 中,上面的代码段现在已被编译器接受,此特性可以为整体的 match 表达式带来更流畅、更一致的体验。 函数参数的属性 现在允许在函数、闭包和函数指针的参数上使用属性。 比如以往这样编写: #[cfg(windows)] fn len(slice: &[u16]) -> usize { slice.len() } #[cfg(not(windows))] fn len(slice: &[u8]) -> usize { slice.len() } 现在可以以更简洁的方式: fn len( #[cfg(windows)] slice: &[u16], // This parameter is used on Windows. #[cfg(not(windows))] slice: &[u8], // Elsewhere, this one is used. ) -> usize { slice.len() } 这里可以使用的属性包括:
这在整个语言生态中提供了一个更具可读性的基于宏的 DSL。 标准库中增加的 const fn 此版本中,以下函数成为 const fn:
增加到标准库的函数 以下函数已经稳定:
详情查看更新说明: https://blog.rust-lang.org/2019/11/07/Rust-1.39.0.html (责任编辑:IT) |