學習Rust 基礎語法

安全劍客發表於2020-12-03
Rust 語言是一種高效、可靠的通用高階語言。其高效不僅限於開發效率,它的執行效率也是令人稱讚的,是一種少有的兼顧開發效率和執行效率的語言。

學習Rust 基礎語法學習Rust 基礎語法
變數,基本型別,函式,註釋和控制流,這些幾乎是每種程式語言都具有的程式設計概念。
這些基礎概念將存在於每個 Rust 程式中,及早學習它們將使你以最快的速度學習 Rust 的使用。

變數

首先必須說明,Rust 是強型別語言,但具有自動判斷變數型別的能力。這很容易讓人與弱型別語言產生混淆。

如果要宣告變數,需要使用 let 關鍵字。例如:

let a = 123;

只學習過 JavaScript 的開發者對這句話很敏感,只學習過 C 語言的開發者對這句話很不理解。

在這句宣告語句之後,以下三行程式碼都是被禁止的:

a = "abc";
a = 4.56; 
a = 456;

第一行的錯誤在於當宣告 a 是 123 以後,a 就被確定為整型數字,不能把字串型別的值賦給它。

第二行的錯誤在於自動轉換數字精度有損失,Rust 語言不允許精度有損失的自動資料型別轉換。

第三行的錯誤在於 a 不是個可變變數。

前兩種錯誤很容易理解,但第三個是什麼意思?難道 a 不是個變數嗎?

這就牽扯到了 Rust 語言為了高併發安全而做的設計:在語言層面儘量少的讓變數的值可以改變。所以 a 的值不可變。但這不意味著 a 不是"變數"(英文中的 variable),官方文件稱 a 這種變數為"不可變變數"。

如果我們編寫的程式的一部分在假設值永遠不會改變的情況下執行,而我們程式碼的另一部分在改變該值,那麼程式碼的第一部分可能就不會按照設計的意圖去運轉。由於這種原因造成的錯誤很難在事後找到。這是 Rust 語言設計這種機制的原因。

當然,使變數變得"可變"(mutable)只需一個 mut 關鍵字。

let mut a = 123;
a = 456;

這個程式是正確的。

常量與不可變變數的區別

既然不可變變數是不可變的,那不就是常量嗎?為什麼叫變數?

變數和常量還是有區別的。在 Rust 中,以下程式是合法的:

let a = 123;
let a = 456;

但是如果 a 是常量就不合法:

const a: i32 = 123;
let a = 456;

變數的值可以"重新繫結",但在"重新繫結"以前不能私自被改變,這樣可以確保在每一次"繫結"之後的區域裡編譯器可以充分的推理程式邏輯。 雖然 Rust 有自動判斷型別的功能,但有些情況下宣告型別更加方便:

let a: u64 = 123;

這裡宣告瞭 a 為無符號 64 位整型變數,如果沒有宣告型別,a 將自動被判斷為有符號 32 位整型變數,這對於 a 的取值範圍有很大的影響。

重影(Shadowing)

重影的概念與其他面嚮物件語言裡的"重寫"(Override)或"過載"(Overload)是不一樣的。重影就是剛才講述的所謂"重新繫結",之所以加引號就是為了在沒有介紹這個概念的時候代替一下概念。

重影就是指變數的名稱可以被重新使用的機制:

例項

fn main() {
    let x = 5;
    let x = x + 1;
    let x = x * 2;
    println!("The value of x is: {}", x);
}

這段程式的執行結果:

The value of x is: 12

重影與可變變數的賦值不是一個概念,重影是指用同一個名字重新代表另一個變數實體,其型別、可變屬性和值都可以變化。但可變變數賦值僅能發生值的變化。

let mut s = "123";
s = s.len();

這段程式會出錯:不能給字串變數賦整型值。

原文地址:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2738982/,如需轉載,請註明出處,否則將追究法律責任。

相關文章