Rust 1.39.0 发布,async/.await 终于稳定了

oschina
 oschina
发布于 2019年11月11日
收藏 7

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_varref 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()
}

这里可以使用的属性包括:

  1. 条件编译:cfg 和 cfg_attr

  2. 控制 lint:allow、warn、deny 与 forbid

  3. 应用于项目的过程宏属性使用的帮助程序属性

这在整个语言生态中提供了一个更具可读性的基于宏的 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

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:Rust 1.39.0 发布,async/.await 终于稳定了
加载中

精彩评论

ddatsh
ddatsh
我觉得我智商不太适合学语法这么复杂的语言
dwingo
dwingo
Rust就像拉力赛车, 我羡慕它的性能和驾驭它的人, 但我上班郊游并不想开这种车.
久永
久永
他的话不就是等价于:
“‘现在人类终于能翱翔蓝天’,造不?鸟类都会飞5000万年了。”
乌龟壳
乌龟壳
不是一个概念,c# 也早就有这个关键字了,但是 rust 和其他语言有一些根本上的区别
就算引入 await/async 也要保障内存安全,这就是它的复杂性所在。
sdflysha
sdflysha
C#开发者发来贺电!

最新评论(25

kiki1000
kiki1000
目前还不稳定啊,什么时候稳定再用。
一码千里
这么复杂我脑子病才不继续用C++
xoHome
xoHome
别的语言你学20%能写20%的代码 学80%能写80%的代码,而Rust是你不学完100%连10%的代码都不会写。
Charles_Ho
Charles_Ho
还是c++它爹说得对,不要把自己的意志强加给程序员。
松花江水姐姐
松花江水姐姐
rust go 看起来很不舒服的语法
Mark哥是我
Mark哥是我
我看C++也不舒服,看JS,JAVA,C#舒服!
__JM_Joy__
__JM_Joy__
这门语言本来就不是准备给用代码糊屎的人,擅长c语言的人学这门语言太轻松。难?不存在的。
来自山卡拉的你
来自山卡拉的你
等有时间,把现有的golang项目全部转为rust哈
dwingo
dwingo
Rust就像拉力赛车, 我羡慕它的性能和驾驭它的人, 但我上班郊游并不想开这种车.
流浪汉中写代码最好的
流浪汉中写代码最好的
这么复杂的语法,简直毫无美感,啰嗦的语法怪异的符号使用
egmkang
egmkang
这语法比golang好看多了
TeaWeb
TeaWeb
具体说说golang的哪个语法不好看?
返回顶部
顶部