W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
幾乎所有非 “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ù)打印起來并不是很復雜。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: