iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 19
2
Software Development

30 天深入淺出 Rust系列 第 19

Rust 2018

Rust 2018 是在今年底預計發佈的 1.31 版本,同時也會有些語法上的改變,如果你想在自己的電腦上使用你必須安裝 beta 或 nightly 版本的 Rust ,使用 rustup 安裝請輸入底下指令:

$ rustup toolchain install nightly

如果你想直接用 rustc 編譯 Rust 2018 的話你需要像這樣:

$ rustc --edition 2018 main.rs

加上 --edition 2018 ,若是要讓專案使用 Rust 2018 的話則要在 Cargo.toml[package] 中加上 edition = "2018"

若你想要在 Playground 中使用 Rust 2018 的話,在上排的選單中可以選擇版本:

Image

NLL

這是 Rust 新的 borrow checker ,它讓你可以編譯像這樣的程式碼:

let mut array = [0, 1];
let a = &mut array[0];
*a = 2;
let b = &mut array[1];
*b = 3;

Playground

這在現在的版本是無法通過編譯的,你可以在 Playground 中使用 Rust 2015 編譯看看,同時 NLL 也提供更好的錯誤訊息。

Module Path

在 Rust 2018 中 module 的路徑都必須要以 crate 的名稱或 cratesuperself 其中一個開頭,其中 crate 代表著目前的專案,原先可以直接使用在同一層的模組的,所以若原本的模組是像這樣:

mod a {
  fn foo() {}
}
mod b {
  fn bar() {}
}

// 原本可以用

use a::foo;
use b::bar;

// Rust 2018 要用

use self::a::foo;
use self::b::bar;

Raw Identifier

Rust 2018 中可以讓你拿原本的關鍵字來當變數名稱等等的了,只是使用起來有點不太一樣:

fn r#match() {
}

fn main() {
  r#match();
}

要加上 r# 還有是點麻煩。

匿名 lifetime

現在可以使用 '_ 在某些非得加上 lifetime 的地方,讓編譯器自動推導了,不過這個功能目前還很不穩定,很容易就把編譯器弄當了,雖然 Rust 的編譯器當掉也只是出現請你回報的錯誤訊息而已,不過會讓錯誤訊息都不顯示也挺麻煩的。

struct Foo<'a> {
  a: &'a i32,
}

// 原本要寫
impl<'a> Foo<'a> {
}

// 這邊可以用 '_ 讓編譯器去推導了
impl Foo<'_> {
}

dyn

原本若傳遞 trait 的 borrow 是寫成 &Trait ,但在 Rust 2018 中要寫成 &dyn Trait ,這基本上是個讓語法更清楚的改進,原本的寫法也還是可以接受的。

有些什麼樣的新功能也可以去看看 Edition Guide ,這是個介紹 Rust 2018 的新功能的文件,另外有興趣也可以看看 Unstable Book 這邊列出了目前還不穩定的功能,雖然大部份都只有名稱跟連結而已,並沒有介紹。

接下來就要開始進入應用篇了,下一篇我要來介紹一些個人覺得常用或好用的 crate 。


上一篇
「不安全」的 Rust
下一篇
Crates 與工具
系列文
30 天深入淺出 Rust33
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言