<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Rust 勸退系列 03:變量

          共 3495字,需瀏覽 7分鐘

           ·

          2021-04-19 19:21

          閱讀本文大概需要 5 分鐘。

          大家好,我是站長 polarisxu。

          這是 Rust 勸退系列的第 3 個教程,探討 Rust 中的變量。

          01 變量和綁定

          變量指定了某存儲單元(Memory Location)的名稱,該存儲單元會存儲特定類型的值。

          Rust 是靜態(tài)類型語言,不能在運(yùn)行期改變變量類型。

          和你熟悉的大部分編程語言不一樣,Rust 中變量一般不叫聲明,而叫做綁定(這是從函數(shù)式語言中借鑒的,使用關(guān)鍵字 let 綁定),那有什么區(qū)別呢?

          在 Go 語言中一般有下面幾種聲明變量的方式:

          var age = 10
          var age int
          var age int = 10
          age := 10 // 只能在函數(shù)內(nèi)部使用
          // 可以分組
          var (
           age = 10
            birthday = "01-01"
          )

          Go 中聲明變量,可以不指定類型(會進(jìn)行類型推導(dǎo)),也可以不給初始值(會有默認(rèn)初始值)。

          而 Rust 中,形式比較少,主要有兩種:

          let age = 10;
          let age: i32 = 10;

          和 Go 一樣,大部分時候,Rust 也能夠推導(dǎo)出類型。在顯示指定類型時,需要加上 :。關(guān)于類型,后續(xù)講解。

          那為什么 Rust 中變量創(chuàng)建一般叫做綁定呢?

          1)Rust 和 C 一樣,變量創(chuàng)建后必須初始化后才能使用(未使用的變量會警告)。以下代碼編譯報錯:

          fn main() {
              let age: i32;
              println!("age is {}", age);
          }
          // error[E0381]: borrow of possibly-uninitialized variable: `age`

          2)Rust 中,通過 let 關(guān)鍵字,在標(biāo)識符(如變量 age)與值(如 10)之間建立起一種關(guān)聯(lián)關(guān)系。表明所有權(quán)關(guān)系。也就是說這塊內(nèi)存現(xiàn)在屬于 age 了。

          熟悉 JS 的朋友,應(yīng)該對 var 和 let 很親切,不過兩者的區(qū)別和 Go 中的 var 與 Rust 的 let 區(qū)別不一樣。

          02 可變性

          第一次看到下面的代碼報錯,你肯定特別的驚訝:

          fn main() {
              let age = 10;
              println!("age is {}", age);
              age = 11;
              println!("age is {}", age);
          }
          // error[E0384]: cannot assign twice to immutable variable `age`

          沒錯,Rust 中的變量默認(rèn)是不可變的(好吧,變量不可變。。。但又不是常量)。這也是 Rust 中內(nèi)存管理很重要的一個特性。

          如果我想變量可變,怎么辦?Rust 提供了關(guān)鍵字 mut,這叫做可變綁定:

          fn main() {
              let mut age = 10;
              println!("age is {}", age);
              age = 11;
              println!("age is {}", age);
          }

          通常,我們應(yīng)該優(yōu)先創(chuàng)建不可變變量,只有真的需要時,才使用可變變量。

          03 隱藏(shadow)

          因?yàn)樽兞磕J(rèn)不可變,Rust 中還存在這樣「詭異」的情況。下面代碼一切正常:

          fn main() {
              let age = 10;
              println!("age is {}", age);
              let age = 11;
              println!("age is {}", age);
          }

          在 Go 中,肯定報重復(fù)聲明。

          這種「重復(fù)」創(chuàng)建同名變量的語法,Rust 中叫做隱藏(Shadow)。也就是說上次創(chuàng)建的被這次創(chuàng)建的隱藏了。具體有什么用呢?

          比如類似這樣的代碼,在 Go 中還是比較常見的:

          ageStr := req.FormValue("age")
          age, err := strconv.Atoi(ageStr)

          也就是說,同樣的數(shù)值,因?yàn)轭愋筒煌枰脙蓚€不同名稱的變量表示。但 Rust 中可以這樣:

          fn main() {
              let age = "10";
              let age = age.parse::<i32>().unwrap();
              println!("age is {}", age);
          }

          不過這種語法有好處也有弊端。當(dāng)涉及到作用域時,要特別注意隱藏的問題。這和 Go 中的簡短聲明(:=)的「坑」很像。類似下面這樣的代碼,最后的 age 依然是 10:(實(shí)際中的代碼一般不會這么明顯)

          fn main() {
              let age = 10;
              {
                  let age = "abc";
                  println!("age is {}", age);
              }
              println!("age is {}", age);
          }
          // age is abc
          // age is 10

          可見,隱藏只會其所屬作用域內(nèi)生效。

          04 小結(jié)

          Rust 是靜態(tài)類型語言,運(yùn)行期間不能改變變量類型。

          • 通過 let 創(chuàng)建變量,Rust 中一般叫做變量綁定;
          • 默認(rèn)變量不可變,創(chuàng)建可變綁定,可以在變量名前加上 mut 關(guān)鍵字;
          • 重復(fù)定義重名變量會隱藏(shadow)之前的變量,但要注意作用域問題;

          本節(jié)內(nèi)容還是比較簡單的,但要注意和你所學(xué)語言不同的點(diǎn)以及可能的坑。沒被勸退吧~




          往期推薦


          歡迎關(guān)注我

          都看到這里了,隨手點(diǎn)個贊支持下唄!


          瀏覽 66
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  夜夜躁狠狠躁日日躁 | 小泽玛莉亚黑人初体验 | 国产女主播桃花视频 | 97人妻网 | 免费靠逼视频 |