成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Rust 勸退之變量

開發 前端
變量指定了某存儲單元(Memory Location)的名稱,該存儲單元會存儲特定類型的值。Rust 是靜態類型語言,不能在運行期改變變量類型。

[[394170]]

大家好,我是站長 polarisxu。

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

01 變量和綁定

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

Rust 是靜態類型語言,不能在運行期改變變量類型。

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

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

  1. var age = 10 
  2. var age int 
  3. var age int = 10 
  4. age := 10 // 只能在函數內部使用 
  5. // 可以分組 
  6. var ( 
  7.  age = 10 
  8.   birthday = "01-01" 

Go 中聲明變量,可以不指定類型(會進行類型推導),也可以不給初始值(會有默認初始值)。

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

  1. let age = 10; 
  2. let age: i32 = 10; 

和 Go 一樣,大部分時候,Rust 也能夠推導出類型。在顯示指定類型時,需要加上 :。關于類型,后續講解。

那為什么 Rust 中變量創建一般叫做綁定呢?

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

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

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

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

02 可變性

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

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

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

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

  1. fn main() { 
  2.     let mut age = 10; 
  3.     println!("age is {}", age); 
  4.     age = 11; 
  5.     println!("age is {}", age); 

通常,我們應該優先創建不可變變量,只有真的需要時,才使用可變變量。

03 隱藏(shadow)

因為變量默認不可變,Rust 中還存在這樣「詭異」的情況。下面代碼一切正常:

  1. fn main() { 
  2.     let age = 10; 
  3.     println!("age is {}", age); 
  4.     let age = 11; 
  5.     println!("age is {}", age); 

在 Go 中,肯定報重復聲明。

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

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

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

也就是說,同樣的數值,因為類型不同,需要用兩個不同名稱的變量表示。但 Rust 中可以這樣:

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

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

  1. fn main() { 
  2.     let age = 10; 
  3.     { 
  4.         let age = "abc"
  5.         println!("age is {}", age); 
  6.     } 
  7.     println!("age is {}", age); 
  8. // age is abc 
  9. // age is 10 

可見,隱藏只會其所屬作用域內生效。

04 小結

Rust 是靜態類型語言,運行期間不能改變變量類型。

通過 let 創建變量,Rust 中一般叫做變量綁定;

默認變量不可變,創建可變綁定,可以在變量名前加上 mut 關鍵字;

重復定義重名變量會隱藏(shadow)之前的變量,但要注意作用域問題;

本節內容還是比較簡單的,但要注意和你所學語言不同的點以及可能的坑。沒被勸退吧~

本文轉載自微信公眾號「polarisxu」,可以通過以下二維碼關注。轉載本文請聯系polarisxu公眾號。

 

 

責任編輯:武曉燕 來源: polarisxu
相關推薦

2023-10-30 23:38:03

Rust編程基礎

2021-07-07 21:40:46

Rust函數勸退

2021-04-28 18:16:24

Rust數據類型

2011-10-08 14:09:27

JavaScript

2014-08-06 11:59:16

Xcode變量summary

2022-09-22 07:31:14

Java變量計算

2023-05-04 07:33:39

Rust變量常量

2020-10-22 11:15:47

Go語言變量

2021-09-29 10:00:07

Go語言基礎

2021-10-13 10:00:52

Go語言基礎

2021-05-27 05:27:22

流程控制Rust

2021-11-09 06:42:51

MySQLupdate語句

2009-12-31 16:32:27

數據中心之變 系統

2012-06-19 14:17:25

PC計算

2009-12-31 16:34:09

數據中心之變 機房

2010-04-14 15:44:13

2020-04-15 16:02:33

云市場混合云云服務

2009-12-31 16:20:52

數據中心之變 運維

2015-01-21 16:59:58

傲游瀏覽器MxNitro

2023-10-31 14:04:17

Rust類型編譯器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲免费视频一区二区 | 免费观看一区二区三区毛片 | www.日韩| 成人在线视频一区 | 日韩激情免费 | 成人一区二 | 亚洲国产精品久久久 | 黄色片在线 | 成年人精品视频在线观看 | 日韩在线观看一区 | 成人国产综合 | 欧美日韩综合 | 福利视频网 | 久久99精品久久久久久国产越南 | 欧美精品在线免费 | 男人的天堂一级片 | 亚洲97| av一区二区三区在线观看 | 亚洲精品视频网站在线观看 | 91xxx在线观看 | 国产视频一区二区 | 欧美一区二区大片 | 在线观看中文字幕一区二区 | 成人精品久久久 | 成人影院在线视频 | 五月婷六月丁香 | 精品国模一区二区三区欧美 | 日韩精品在线免费观看 | 精品99久久 | 国产精品国产成人国产三级 | 久久高清国产视频 | 亚州精品天堂中文字幕 | 日韩视频一区二区 | 日日碰狠狠躁久久躁96avv | 国产精品久久久久久久久免费软件 | 国产片侵犯亲女视频播放 | 一级毛片视频免费观看 | 91视频在线看 | 色呦呦网站 | 福利av在线 | 欧洲毛片|