偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Rust 勸退系列 之基本數(shù)據(jù)類(lèi)型

開(kāi)發(fā) 后端
Rust 和 Go 一樣,都是靜態(tài)類(lèi)型語(yǔ)言,這表示每個(gè)變量的類(lèi)型必須明確。和 Go 類(lèi)似,大多數(shù)情況下,Rust 編譯器能夠推斷出某個(gè)值的類(lèi)型,不需要我們顯示指定,寫(xiě)起來(lái)有點(diǎn)類(lèi)似于弱類(lèi)型似語(yǔ)言。

[[396647]]

大家好,我是站長(zhǎng) polarisxu。

這是 Rust 勸退系列的第 4 個(gè)教程,探討 Rust 中的基本數(shù)據(jù)類(lèi)型,或叫標(biāo)量類(lèi)型(scalar type)。

Rust 和 Go 一樣,都是靜態(tài)類(lèi)型語(yǔ)言,這表示每個(gè)變量的類(lèi)型必須明確。和 Go 類(lèi)似,大多數(shù)情況下,Rust 編譯器能夠推斷出某個(gè)值的類(lèi)型,不需要我們顯示指定,寫(xiě)起來(lái)有點(diǎn)類(lèi)似于弱類(lèi)型似語(yǔ)言。但有些情況下,必須明確告知編譯器我們使用什么類(lèi)型,在 Rust 中,這叫 「類(lèi)型注解」(type annotations)。

對(duì)于類(lèi)型注解,看一個(gè)常見(jiàn)的例子:

  1. let guess = "42".parse().expect("Not a number!"); 

這是將字符串 "42" 轉(zhuǎn)為數(shù)字 42。在 Go 語(yǔ)言中,一般這么做:

  1. guess, err := strconv.Atoi("42"
  2. if err != nil { 
  3.   panic(err) 

但上面的 Rust 代碼會(huì)報(bào)錯(cuò):

  1. error[E0282]: type annotations needed 
  2.  --> src/main.rs:2:9 
  3.   | 
  4. 2 |     let guess = "42a".parse().expect("Not a number!"); 
  5.   |         ^^^^^^ consider giving `guess` a type 

這和 Go 還是不太一樣。Go 中很多時(shí)候,數(shù)值類(lèi)型會(huì)是 int。

為了修復(fù)這個(gè)問(wèn)題,我們需要為 number 指定一個(gè)類(lèi)型,比如 u32。

  1. let guess: u32 = "42".parse().expect("Not a number!"); 

吐槽:在 Rust 中,類(lèi)型注解和 Go 中一樣,放在變量后面。但 Rust 中變量和類(lèi)型直接非得加一個(gè)冒號(hào)(:),而且一般冒號(hào)緊跟著變量名(rustfmt 的建議)。不知道冒號(hào)有啥特殊需要?!

Rust 內(nèi)置如下基本數(shù)據(jù)類(lèi)型:

  • 整數(shù)類(lèi)型
    • 有符合整數(shù):i8、i16、i32、i64、i128、isize
    • 無(wú)符號(hào)整數(shù):u8、u16、u32、u64、u128、usize
  • 浮點(diǎn)類(lèi)型:f32、f64
  • 布爾型:bool
  • 字符型:char

01 整數(shù)類(lèi)型

將整數(shù)類(lèi)型整理為一張表,如下:(用 Go 語(yǔ)言對(duì)應(yīng)的類(lèi)型作對(duì)比)

長(zhǎng)度 有符號(hào) 無(wú)符號(hào) Go 有符號(hào) Go 無(wú)符號(hào)
8-bit i8 u8 int8 uint8
16-bit i16 u16 int16 uint16
32-bit i32 u32 int32 uint32
64-bit i64 u64 int64 uint64
128-bit i128 u128 - -
arch isize usize int uint

吐槽:有時(shí)候 Rust 真的很節(jié)省,int、uint 直接省略為 i、u,function 省略為 fn。但有時(shí)候又很繁瑣(不簡(jiǎn)潔),比如前面說(shuō)到的變量和類(lèi)型之間的冒號(hào)。。。

這里用 u、i 的形式,也需要一段時(shí)間適應(yīng)。。。

兩點(diǎn)說(shuō)明:

  • Go 中沒(méi)有 128 位長(zhǎng)度的整數(shù)
  • isize 和 usize 對(duì)應(yīng) Go 中的 int 和 uint,它們的長(zhǎng)度依賴(lài)運(yùn)行程序的計(jì)算機(jī)架構(gòu):64 位架構(gòu)上它們是 64 位的, 32 位架構(gòu)上它們是 32 位的

在 Go 中,整型變量默認(rèn)類(lèi)型是 int,以下代碼可以證明這一點(diǎn):

  1. x := 32 
  2. fmt.Printf("%T\n", i) 
  3. // 輸出:int 

那 Rust 中默認(rèn)是什么類(lèi)型呢?

我想在 Rust 中找到一種辦法,打印變量類(lèi)型,網(wǎng)上找到了這樣的辦法(有點(diǎn)挫):

  1. // 打印變量類(lèi)型的函數(shù)。該函數(shù)看不懂先放著。 
  2. fn print_type_of<T>(_: &T) { 
  3.   println!("{}", std::any::type_name::<T>()) 
  4.  
  5. fn main() { 
  6.     let x = 32; 
  7.     print_type_of(&x); 
  8.    // 輸出:i32 

可見(jiàn) Rust 中整型變量默認(rèn)類(lèi)型是 i32(即使在 64 位機(jī)器上,也是 i32)。這一定程度上說(shuō)明,在 Go 中,整數(shù)一般建議用 int 類(lèi)型;而 Rust 中,一般建議用 i32 類(lèi)型。(所以,為什么開(kāi)頭的 parse 不能默認(rèn)推斷為 i32 類(lèi)型呢?怕溢出?)

更智能的類(lèi)型推斷

上文說(shuō) Rust 和 Go 一樣,支持類(lèi)型推斷。不過(guò) Rust 的推斷更智能,怎么個(gè)智能法?看下面的代碼:

  1. // 打印變量類(lèi)型的函數(shù) 
  2. fn print_type_of<T>(_: &T) { 
  3.     println!("{}", std::any::type_name::<T>()) 
  4.  
  5. fn main() { 
  6.     let x = 32; 
  7.     let y: i8 = x; 
  8.     print_type_of(&x); 
  9.     print_type_of(&y) 

根據(jù)上面的講解,x 應(yīng)該是默認(rèn)類(lèi)型:i32。但實(shí)際上,x 和 y 的類(lèi)型都是 i8。也就是說(shuō),因?yàn)?x 的類(lèi)型沒(méi)有顯示的指定(類(lèi)型注解),Rust 編譯器會(huì)根據(jù)上下文(實(shí)際上是 let y: i8 = x 這句)推斷出 x 的類(lèi)型應(yīng)該和 y 一致,即 i8。

在 Go 中,int8 和 int 是不會(huì)進(jìn)行隱式轉(zhuǎn)換的,Rust 也一樣,必須進(jìn)行顯示轉(zhuǎn)換。但 Rust 的智能類(lèi)型推斷,可以讓開(kāi)發(fā)者少寫(xiě)類(lèi)型轉(zhuǎn)換的代碼。

比如上面代碼,在 Go 語(yǔ)言中是行不通的:

  1. package main 
  2.  
  3. import ( 
  4.  "fmt" 
  5.  
  6. func main() { 
  7.  x := 32 
  8.  var y int8 = x 
  9.  fmt.Printf("%T\n", x) 
  10.  fmt.Printf("%T\n", y) 

會(huì)報(bào)錯(cuò):

  1. cannot use x (type intas type int8 in assignment 

也就是說(shuō),Go 中的類(lèi)型推斷不會(huì)考慮上下文,因此沒(méi)有 Rust 智能。

因?yàn)榫幾g器的強(qiáng)大,VSCode 中(安裝 rust-analyzer)會(huì)有類(lèi)型提示,這樣上面的 print_type_of 函數(shù)也不需要了。做了一個(gè)動(dòng)圖,注意上面 x 的類(lèi)型變化:

此外,isize 和 usize 類(lèi)型一般用作某些集合的索引,以后文章會(huì)看到。

關(guān)于各種類(lèi)型的表示范圍我列出了,因?yàn)檫@個(gè)系列不是為無(wú)編程經(jīng)驗(yàn)的人準(zhǔn)備的。這個(gè)系列更多是為 Go 愛(ài)好者準(zhǔn)備的 Rust 教程,因此和 Go 一致的地方可能不會(huì)講。

02 浮點(diǎn)類(lèi)型

和 Go 一樣,Rust 也有兩種浮點(diǎn)數(shù)類(lèi)型:f32 和 f64,對(duì)應(yīng) Go 中的 float32 和 float64。和 Go 一樣,默認(rèn)類(lèi)型是 f64,可以通過(guò)類(lèi)型注解指定具體的浮點(diǎn)類(lèi)型。

  1. let x = 2.0; // 默認(rèn)是 f64 

一般地,整數(shù)類(lèi)型和浮點(diǎn)類(lèi)型都成為數(shù)值類(lèi)型。

數(shù)值類(lèi)型有一些共同的東西。比如都支持基本的數(shù)學(xué)運(yùn)算。此外,除了通過(guò)類(lèi)型注解指定類(lèi)型,數(shù)值類(lèi)型還可以在字面值后面帶上類(lèi)型后綴指定類(lèi)型,比如:

  1. let x = 2.0f32; // f32 類(lèi)型 
  2. let y = 32i64; // i64 類(lèi)型 

03 布爾型

和 Go 語(yǔ)言一樣,Rust 中的布爾類(lèi)型使用 bool 表示(咋沒(méi)用 b、bl 之類(lèi)的縮寫(xiě)呢?哈哈哈)。有兩個(gè)可能的值:true 和 false。

  1. fn main() { 
  2.     let t = true
  3.  
  4.     let f: bool = false; // 顯式指定類(lèi)型注解 

04 字符型

Rust 中的 char 表示字符類(lèi)型,是 Rust 的基本類(lèi)型,字面值由單引號(hào)指定。

  1. let a = 'a'
  2. let b = '中'
  3. let c = '🤣'

可見(jiàn),Rust 中的 char 類(lèi)型和 Go 中的 rune 一樣,表示的是 Unicode 碼點(diǎn),占 4 個(gè)字節(jié)。

因?yàn)?Rust 中的字符串很復(fù)雜,而且不是基本類(lèi)型,因此留在以后講解。

05 小結(jié)

本文介紹了 Rust 中的四種基本數(shù)據(jù)類(lèi)型:整型、浮點(diǎn)型、布爾型和字符型。其中,浮點(diǎn)型、布爾型和字符型分別對(duì)應(yīng) Go 中的浮點(diǎn)型、布爾型和 rune 類(lèi)型,但整型,Go 和 Rust 有些許不一樣,上文已經(jīng)詳細(xì)介紹了。此外,Go 中復(fù)數(shù)也是基本數(shù)據(jù)類(lèi)型:complex64 和 complex128,而 Rust 中沒(méi)有,復(fù)數(shù)通過(guò)第三方庫(kù)實(shí)現(xiàn),比如:https://crates.io/crates/easy_complex。

此外,你可能會(huì)說(shuō) Go 中還有一個(gè)基本類(lèi)型:byte,而 Rust 沒(méi)有。其實(shí) Go 中的 byte 只是 uint8 的別名。另外,string 在 Go 中是基本數(shù)據(jù)類(lèi)型,而在 Rust 中不是。

本文轉(zhuǎn)載自微信公眾號(hào)「polarisxu」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系polarisxu公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: polarisxu
相關(guān)推薦

2021-07-07 21:40:46

Rust函數(shù)勸退

2016-08-18 14:13:55

JavaScript基本數(shù)據(jù)引用數(shù)據(jù)

2010-10-08 09:02:03

JavaScript基

2023-05-14 18:56:50

Rust數(shù)據(jù)類(lèi)型

2011-05-26 14:27:56

java

2019-11-11 14:55:25

Redis數(shù)據(jù)類(lèi)型命令

2023-03-27 10:04:27

數(shù)據(jù)類(lèi)型浮點(diǎn)型布爾型

2017-02-27 08:34:09

JavaScript數(shù)據(jù)引用

2009-08-14 11:15:45

C#基本數(shù)據(jù)類(lèi)型

2020-10-26 13:46:07

Java基礎(chǔ)入門(mén)篇

2010-04-27 11:03:39

Oracle Java

2018-05-25 09:50:30

Java數(shù)據(jù)類(lèi)型類(lèi)型轉(zhuǎn)換

2023-07-04 08:41:08

Redis數(shù)據(jù)類(lèi)型

2010-01-18 16:49:36

VB.NET基本數(shù)據(jù)類(lèi)

2021-04-19 20:36:06

存儲(chǔ)Rust變量

2023-11-01 16:01:00

數(shù)據(jù)類(lèi)型Rust

2024-04-11 13:02:10

Rust數(shù)據(jù)類(lèi)型

2024-11-04 06:20:00

Redis單線(xiàn)程

2024-06-11 08:30:31

2010-10-08 15:11:28

JavaScript數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)