Rust 2018 是在今年底預計發佈的 1.30
版本,同時也會有些語法上的改變,如果你想在自己的電腦上使用你必須安裝 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 的話,在上排的選單中可以選擇版本:
這是 Rust 新的 borrow checker ,它讓你可以編譯像這樣的程式碼:
let mut array = [0, 1];
let a = &mut array[0];
*a = 2;
let b = &mut array[1];
*b = 3;
這在現在的版本是無法通過編譯的,你可以在 Playground 中使用 Rust 2015 編譯看看,同時 NLL 也提供更好的錯誤訊息。
在 Rust 2018 中 module 的路徑都必須要以 crate 的名稱或 crate
、 super
、 self
其中一個開頭,其中 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;
Rust 2018 中可以讓你拿原本的關鍵字來當變數名稱等等的了,只是使用起來有點不太一樣:
fn r#match() {
}
fn main() {
r#match();
}
要加上 r#
還有是點麻煩。
現在可以使用 '_
在某些非得加上 lifetime 的地方,讓編譯器自動推導了,不過這個功能目前還很不穩定,很容易就把編譯器弄當了,雖然 Rust 的編譯器當掉也只是出現請你回報的錯誤訊息而已,不過會讓錯誤訊息都不顯示也挺麻煩的。
struct Foo<'a> {
a: &'a i32,
}
// 原本要寫
impl<'a> Foo<'a> {
}
// 這邊可以用 '_ 讓編譯器去推導了
impl Foo<'_> {
}
原本若傳遞 trait 的 borrow 是寫成 &Trait
,但在 Rust 2018 中要寫成 &dyn Trait
,這基本上是個讓語法更清楚的改進,原本的寫法也還是可以接受的。
有些什麼樣的新功能也可以去看看 Edition Guide ,這是個介紹 Rust 2018 的新功能的文件,另外有興趣也可以看看 Unstable Book 這邊列出了目前還不穩定的功能,雖然大部份都只有名稱跟連結而已,並沒有介紹。
接下來就要開始進入應用篇了,下一篇我要來介紹一些個人覺得常用或好用的 crate 。