變量綁定

2018-08-12 22:03 更新

變量綁定

幾乎所有非 “Hello World” Rust 程序使用變量綁定。如下的形式:

 fn main() {
    let x = 5;
 }

在每個例子中都寫 fn main(){ 顯得有點冗余,所以在以后我們會省略掉它。如果你一直跟著教程學習,確保修改你的 mian() 函數(shù),而不是丟掉了它。否則,你的程序編譯會得到一個錯誤。

在許多語言中,這被稱為一個變量,但 Rust 中的變量綁定有一些小竅門需要注意。例如讓表達式的左邊是一個 “pattern”,而不僅僅是一個變量名。這意味著我們可以這樣做:

 let (x, y) = (1, 2);

這個表達式求值后,x 將會被賦值為 1,y 將會被賦值為 2。Pattern 是非常的強大,在本教程中有專門的章節(jié)講解。我們暫時不需要這些功能,所以我們就把暫時不關注這個,繼續(xù)學習本節(jié)的知識。

Rust 是一種靜態(tài)類型語言,這意味著我們要提前指定類型,并且在編譯時期被檢查。那么,為什么我們的第一個例子能夠被編譯?Rust 有個稱為“類型推斷”的機制。如果它能推斷出變量是什么類型,Rust 就不需要指定實際類型。

如果想要我們可以添加它的類型。在冒號(:)之后輸入類型:

 let x: i32 = 5;

如果我要求你將上面的大聲讀給班上的其他同學,你會說 “x 被綁定為 i32 類型,并且它的值為5。”

在這種情況下,我們選擇將 x 表示為一個 32 位帶符號整數(shù)。Rust 有許多不同的基本的整數(shù)類型。以 i 開頭的表示有符號整型,u 開頭的表示無符號整型??赡艿恼麛?shù)尺寸是 8、16、32、64 位。

在以后的例子中,我們可能會在注釋中說明其類型。以后的例子會看起來像這樣:

 fn main() {
    let x = 5; // x: i32
 }

注意使用 let 的語法和注釋表示的是相似的。和讓您所使用的語法。Rust 中包含上面的注釋方式,但它不是通用的方式,因此我們會偶爾的使用上面的注釋方式來幫助你理解變量表示 Rust 中的實際類型。

默認情況下,綁定是不可變的。這段代碼將不會編譯通過:

 let x = 5;
 x = 10;

它將會輸出如下的錯誤:

error: re-assignment of immutable variable `x`
     x = 10;
     ^~~~~~~

如果你想綁定是可變的,您可以使用 mut 關鍵字:

 let mut x = 5; // mut x:i32
 x = 10;

沒有原因說明默認綁定是不可變的,但我們可以通過考慮 Rust 關注的一個要點:安全性。如果你忘了什么 mut,編譯器會捕捉到它,讓你知道你修改了某些值但是你可能沒有聲明該值為 mut。如果綁定默認情況下是可變的,那么編譯器將無法告訴你這一點。如果你的確想修改變量值,那么解決方案很簡單:添加 mut。

還有其他理由避免出現(xiàn)可變狀態(tài),但他們超出本指南的范圍。一般來說,通??梢员苊怙@式變化,那也是 Rust 所推薦的。也就是說,有時,修改變量是你需要的,但是它不是禁止的。

讓我們回到綁定。Rust 變量綁定與其他語言有一個方面是不同:在你能夠使用綁定變量之前你要初始化該變量。

讓我們來自己動手試一試。修改 src/main.rc 文件,使其中的內(nèi)容像下面的一樣:

 fn main() {
    let x: i32;

    println!("Hello world!");
 }

你可以在命令行中使用 cargo build 命令對該文件進行編譯 。盡管你會得到一個警告,但是仍然會打印 ”Hello, world!“:

 Compiling hello_world v0.0.1 (file:///home/you/projects/hello_world)
src/main.rs:2:9: 2:10 warning: unused variable: `x`, #[warn(unused_variable)]
   on by default
src/main.rs:2     let x: i32;
                      ^

Rust 警告我們從來沒有使用這個變量綁定,但是因為我們從來沒有使用它,沒有破壞性,沒有惡意。然后,如果我們試圖使用變量 x 事情就會發(fā)生變化。讓我們來試一下。改變你的程序為如下的樣子:

 fn main() {
    let x: i32;

    println!("The value of x is:{}", x);
 }

嘗試編譯上面的代碼。將會看到輸出一個錯誤:

$ cargo build
   Compiling hello_world v0.0.1 (file:///home/you/projects/hello_world)
src/main.rs:4:39: 4:40 error: use of possibly uninitialized variable: `x`
src/main.rs:4     println!("The value of x is: {}", x);
                                                    ^
note: in expansion of format_args!
<std macros>:2:23: 2:77 note: expansion site
<std macros>:1:1: 3:2 note: in expansion of println!
src/main.rs:4:5: 4:42 note: expansion site
error: aborting due to previous error
Could not compile `hello_world`.

Rust 不會讓我們使用未初始化的變量。接下來,讓我們談談添加到 println! 中的東西。

如果在你打印的字符串語句中包含花括號({}),Rust 將這個視為請求插入某種值。字符串插入值是一個計算機科學名詞,它的意思是“粘在字符串的中間?!拔覀兲砑右粋€逗號,然后是 x,表明我們希望插入的是 x 的值。如果傳遞給函數(shù)和宏的參數(shù)不止一個,我們用逗號對參數(shù)進行分隔。

當你僅僅只是使用花括號,Rust 通過檢查它的類型將嘗試以一種有意義的方式顯示它的值。如果你想用更詳細的方式指定打印格式,請查看多個可選參數(shù)可用。此時,我們只關注默認值:整數(shù)打印起來并不是很復雜。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號