變量綁定

2018-08-12 22:03 更新

變量綁定

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

 fn main() {
    let x = 5;
 }

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

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

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

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

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

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

 let x: i32 = 5;

如果我要求你將上面的大聲讀給班上的其他同學(xué),你會(huì)說 “x 被綁定為 i32 類型,并且它的值為5?!?/p>

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

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

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

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

默認(rèn)情況下,綁定是不可變的。這段代碼將不會(huì)編譯通過:

 let x = 5;
 x = 10;

它將會(huì)輸出如下的錯(cuò)誤:

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

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

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

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

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

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

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

 fn main() {
    let x: i32;

    println!("Hello world!");
 }

你可以在命令行中使用 cargo build 命令對該文件進(jìn)行編譯 。盡管你會(huì)得到一個(gè)警告,但是仍然會(huì)打印 ”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 警告我們從來沒有使用這個(gè)變量綁定,但是因?yàn)槲覀儚膩頉]有使用它,沒有破壞性,沒有惡意。然后,如果我們試圖使用變量 x 事情就會(huì)發(fā)生變化。讓我們來試一下。改變你的程序?yàn)槿缦碌臉幼?

 fn main() {
    let x: i32;

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

嘗試編譯上面的代碼。將會(huì)看到輸出一個(gè)錯(cuò)誤:

$ 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 不會(huì)讓我們使用未初始化的變量。接下來,讓我們談?wù)勌砑拥?println! 中的東西。

如果在你打印的字符串語句中包含花括號(hào)({}),Rust 將這個(gè)視為請求插入某種值。字符串插入值是一個(gè)計(jì)算機(jī)科學(xué)名詞,它的意思是“粘在字符串的中間。“我們添加一個(gè)逗號(hào),然后是 x,表明我們希望插入的是 x 的值。如果傳遞給函數(shù)和宏的參數(shù)不止一個(gè),我們用逗號(hào)對參數(shù)進(jìn)行分隔。

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)