最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Rust 數(shù)據(jù)類型詳解

 更新時(shí)間:2025年01月20日 16:57:24   作者:Hello.Reader  
本文介紹了Rust編程語(yǔ)言中的標(biāo)量類型和復(fù)合類型,標(biāo)量類型包括整數(shù)、浮點(diǎn)數(shù)、布爾和字符,而復(fù)合類型則包括元組和數(shù)組,標(biāo)量類型用于表示單個(gè)值,具有不同的表示和范圍,本文介紹的非常詳細(xì),感興趣的朋友一起看看吧

一、標(biāo)量類型(Scalar Types)

標(biāo)量類型代表一個(gè)單獨(dú)的值。Rust 中有四大基本標(biāo)量類型:整數(shù)(integer)、浮點(diǎn)數(shù)(floating-point number)、布爾(boolean)和字符(character)。這幾種類型在大多數(shù)編程語(yǔ)言中都很常見(jiàn)。

1. 整數(shù)類型(Integer Types)

整數(shù)(integer)是沒(méi)有小數(shù)部分的數(shù)字。在之前的猜數(shù)字游戲教程里,我們用到了 u32。這個(gè)類型聲明表示該值是一個(gè)無(wú)符號(hào)(unsigned)32 位整數(shù)(如果是有符號(hào)類型,會(huì)以 i 開(kāi)頭,例如 i32)。

下表展示了 Rust 中所有內(nèi)置的整數(shù)類型,每個(gè)類型要么是有符號(hào)(signed),要么是無(wú)符號(hào)(unsigned),并且有明確的位數(shù)大小。

長(zhǎng)度有符號(hào)無(wú)符號(hào)
8-biti8u8
16-biti16u16
32-biti32u32
64-biti64u64
128-biti128u128
archisizeusize
  • 有符號(hào)(signed)表示數(shù)值可能為正也可能為負(fù),所以存儲(chǔ)時(shí)需要符號(hào)位;
  • 無(wú)符號(hào)(unsigned)則只表示非負(fù)數(shù)(0 或正數(shù)),不需要符號(hào)位。

對(duì)于有符號(hào)整數(shù),如果類型是 i8,它可以存儲(chǔ)從 -128 到 127 的數(shù)值;若是 i16,則范圍會(huì)相應(yīng)擴(kuò)大,以此類推。無(wú)符號(hào)類型則從 0 起算。例如 u8 能表示 0 到 255。

isizeusize 根據(jù)系統(tǒng)架構(gòu)的不同而變化:在 64 位架構(gòu)上是 64 位,在 32 位架構(gòu)上是 32 位。這些類型常用于根據(jù)系統(tǒng)架構(gòu)進(jìn)行索引或內(nèi)存大小計(jì)算等場(chǎng)景。

1.1 整數(shù)字面量

在 Rust 中可以使用多種形式來(lái)表達(dá)整數(shù)字面量(literal),如下表所示:

數(shù)字字面量形式示例
十進(jìn)制98_222
十六進(jìn)制0xff
八進(jìn)制0o77
二進(jìn)制0b1111_0000
字節(jié)(僅限 u8b'A'

注意:

  • 可以在數(shù)字中使用下劃線 _ 作為分隔符來(lái)提高可讀性,例如 1_0001000 等價(jià)。
  • 如果需要指定類型,可以在數(shù)字后面加上類型后綴,比如 57u8

通常如果不確定該用什么整數(shù)類型,Rust 默認(rèn)使用 i32。若需要根據(jù)系統(tǒng)架構(gòu)進(jìn)行索引等場(chǎng)景時(shí),才考慮使用 isizeusize。

1.2 整數(shù)溢出(Integer Overflow)

假設(shè)我們有一個(gè) u8 類型的變量,它能表示的數(shù)值范圍是 [0, 255]。如果嘗試將其賦值為 256,就會(huì)發(fā)生整數(shù)溢出(integer overflow),導(dǎo)致以下兩種行為之一:

  • 調(diào)試(debug)模式編譯:Rust 會(huì)執(zhí)行溢出檢查,一旦發(fā)現(xiàn)溢出,就會(huì)在運(yùn)行時(shí) panic(程序崩潰并退出)。
  • 發(fā)布(release)模式編譯:Rust 不做溢出檢查,而是進(jìn)行二補(bǔ)碼環(huán)繞(two’s complement wrapping)。換言之,超出最大可表示值時(shí)會(huì)“環(huán)繞”回最小值。例如,對(duì)于 u8 類型,256 會(huì)變成 0,257 會(huì)變成 1,等等。不會(huì)出現(xiàn) panic,但是結(jié)果往往與期望不符。

在實(shí)際開(kāi)發(fā)中,不應(yīng)依賴整數(shù)溢出的環(huán)繞行為,這被認(rèn)為是錯(cuò)誤的做法。若需要顯式處理溢出,可以使用標(biāo)準(zhǔn)庫(kù)里為整數(shù)提供的以下方法族:

  • wrapping_*:如 wrapping_add,始終進(jìn)行環(huán)繞運(yùn)算;
  • checked_*:如 checked_add,若溢出則返回 None;
  • overflowing_*:如 overflowing_add,返回一個(gè)元組 (結(jié)果, bool),其中 bool 指示是否發(fā)生溢出;
  • saturating_*:如 saturating_add,在溢出時(shí)結(jié)果會(huì)自動(dòng)“飽和”到對(duì)應(yīng)類型的最小或最大值。

2. 浮點(diǎn)數(shù)類型(Floating-Point Types)

Rust 提供了兩種原生的浮點(diǎn)數(shù)類型:f32(32 位)和 f64(64 位)。默認(rèn)使用 f64,因?yàn)樵诂F(xiàn)代 CPU 上,f64f32 速度幾乎相當(dāng),但精度更高。所有浮點(diǎn)類型都是有符號(hào)數(shù)。

fn main() {
    let x = 2.0;    // f64
    let y: f32 = 3.0;  // f32
    println!("x = {}, y = {}", x, y);
}

Rust 的浮點(diǎn)數(shù)遵循 IEEE-754 標(biāo)準(zhǔn)。

3. 數(shù)值運(yùn)算(Numeric Operations)

Rust 支持常見(jiàn)的數(shù)值運(yùn)算:加法、減法、乘法、除法和取余。需要注意的是,整數(shù)除法會(huì)向零方向取整(截?cái)嘈?shù)部分)。示例:

fn main() {
    // 加法
    let sum = 5 + 10;
    // 減法
    let difference = 95.5 - 4.3;
    // 乘法
    let product = 4 * 30;
    // 除法
    let quotient = 56.7 / 32.2;
    // 取余
    let remainder = 43 % 5;
    println!("sum = {}", sum);
    println!("difference = {}", difference);
    println!("product = {}", product);
    println!("quotient = {}", quotient);
    println!("remainder = {}", remainder);
}

如果需要查看 Rust 提供的所有運(yùn)算符,可以參考 附錄 B。

4. 布爾類型(Boolean Type)

布爾類型(bool)只有兩個(gè)可能的值:truefalse。它所占的大小是 1 個(gè)字節(jié)。例如:

fn main() {
    let t = true;
    let f: bool = false;
    println!("t = {}, f = {}", t, f);
}

布爾常常用于條件判斷(如 if 表達(dá)式),后面會(huì)在“控制流”一節(jié)詳述。

5. 字符類型(Character Type)

Rust 的 char 類型是最基礎(chǔ)的字母類型,用單引號(hào)包裹,支持 Unicode Scalar Value。這意味著它可以表示除 ASCII 之外更多的字符,比如帶重音的拉丁字符、中文、日文、韓文、emoji、零寬空格等。例如:

fn main() {
    let c = 'z';
    let z = '?';
    let heart_eyed_cat = '??';
    println!("{}, {}, {}", c, z, heart_eyed_cat);
}

Rust 的 char 類型占 4 個(gè)字節(jié),對(duì)應(yīng) Unicode Scalar Value 范圍:U+0000 ~ U+D7FFU+E000 ~ U+10FFFF。需要注意的是,Unicode 的“字符”概念可能與人們直覺(jué)中的“字符”不完全一致。詳情可參考第 8 章關(guān)于字符串的討論。

二、復(fù)合類型(Compound Types)

復(fù)合類型可以將多個(gè)值組合成一個(gè)類型。Rust 提供了兩種原生的復(fù)合類型:元組(tuple)和數(shù)組(array)。

1. 元組類型(Tuple Type)

元組(tuple)可以將多個(gè)類型各異的值組合到一個(gè)復(fù)合類型中,長(zhǎng)度固定,不可增長(zhǎng)或縮短。使用小括號(hào) () 包含并用逗號(hào)分隔不同的值。例如:

fn main() {
    let tup: (i32, f64, u8) = (500, 6.4, 1);
    println!("tup = {:?}", tup);
}

1.1 解構(gòu)(Destructuring)元組

要獲取元組中的單獨(dú)值,可以使用模式匹配(pattern matching)進(jìn)行解構(gòu):

fn main() {
    let tup = (500, 6.4, 1);
    let (x, y, z) = tup;
    println!("y = {}", y);
}

執(zhí)行后,y 的值就是 6.4。這里 tup 被“拆解”成了 x, y, z 三個(gè)變量的過(guò)程,稱為解構(gòu)。

1.2 使用索引訪問(wèn)元組

也可以直接用點(diǎn)號(hào)加索引來(lái)訪問(wèn)元組的指定元素:

fn main() {
    let x: (i32, f64, u8) = (500, 6.4, 1);
    let five_hundred = x.0;
    let six_point_four = x.1;
    let one = x.2;
    println!("{}, {}, {}", five_hundred, six_point_four, one);
}

需要注意,索引從 0 開(kāi)始。

1.3 單元類型(Unit Type)

如果元組不包含任何元素,則被稱為單元元組(unit)。它寫(xiě)作 (),表示一種空值或空的返回類型。若一個(gè)表達(dá)式?jīng)]有返回任何其他值,默認(rèn)會(huì)返回單元元組。

2. 數(shù)組類型(Array Type)

數(shù)組(array)也是一種把多個(gè)值組合在一起的方式,但它與元組有兩個(gè)主要區(qū)別:

  • 數(shù)組中所有元素類型相同;
  • 數(shù)組長(zhǎng)度固定,一旦聲明,長(zhǎng)度就無(wú)法改變。

例如:

fn main() {
    let a = [1, 2, 3, 4, 5];
    println!("{:?}", a);
}

數(shù)組通常存儲(chǔ)在上(stack)而不是堆上(heap),這在 第 4 章 會(huì)詳細(xì)解釋。若需要一個(gè)可伸縮的序列,則使用標(biāo)準(zhǔn)庫(kù)提供的 向量(vector,Vec<T>)。如果你需要一個(gè)長(zhǎng)度固定的序列,數(shù)組就非常合適。比如月份名稱:

let months = [
    "January", "February", "March", "April", "May", "June",
    "July", "August", "September", "October", "November", "December"
];

2.1 數(shù)組的類型注解

聲明數(shù)組類型時(shí),需要在方括號(hào)里寫(xiě)元素類型、分號(hào)、元素個(gè)數(shù):

let a: [i32; 5] = [1, 2, 3, 4, 5];

這里 i32 是每個(gè)元素的類型,5 表示數(shù)組長(zhǎng)度。

2.2 初始化為相同元素

如果想讓數(shù)組的所有元素都相同,可以使用如下語(yǔ)法:

let a = [3; 5];
// 等價(jià)于 let a = [3, 3, 3, 3, 3];

2.3 訪問(wèn)數(shù)組元素

可以使用索引來(lái)訪問(wèn)數(shù)組元素:

fn main() {
    let a = [1, 2, 3, 4, 5];
    let first = a[0];
    let second = a[1];
    println!("first = {}, second = {}", first, second);
}

2.4 越界訪問(wèn)與運(yùn)行時(shí)錯(cuò)誤

如果索引超出了數(shù)組的長(zhǎng)度,Rust 會(huì)在運(yùn)行時(shí)檢查到錯(cuò)誤并 panic:

fn main() {
    let a = [1, 2, 3, 4, 5];
    println!("請(qǐng)輸入一個(gè)數(shù)組索引。");
    let mut index = String::new();
    std::io::stdin()
        .read_line(&mut index)
        .expect("讀取失敗");
    let index: usize = index
        .trim()
        .parse()
        .expect("輸入的索引不是數(shù)字");
    let element = a[index];
    println!("你選擇的元素是:{}", element);
}

如果你輸入了超出 [0..4] 范圍的索引,比如 10,就會(huì)引發(fā) panic,顯示類似:

thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 10', src/main.rs:19:19

程序因此退出并不會(huì)執(zhí)行后續(xù)的 println!。這是 Rust 保證內(nèi)存安全的體現(xiàn):許多低級(jí)語(yǔ)言在越界索引時(shí)可能會(huì)訪問(wèn)非法內(nèi)存地址,引發(fā)不可預(yù)料的后果,而 Rust 直接在運(yùn)行時(shí)檢測(cè)并退出以保證安全。

小結(jié)

在本篇文章中,我們介紹了 Rust 最常用的兩種數(shù)據(jù)類型子集:標(biāo)量類型復(fù)合類型。標(biāo)量類型包括整數(shù)、浮點(diǎn)數(shù)、布爾和字符,它們各自有不同的表示和范圍;復(fù)合類型包括元組和數(shù)組,可以用于將多個(gè)值組合到一個(gè)類型中,并且在長(zhǎng)度是否可變和類型一致性方面有所區(qū)別。

  • 標(biāo)量類型
    • 整數(shù):如 i32, u32, i8, u8 等,不同字長(zhǎng)和有符號(hào)/無(wú)符號(hào)選擇;
    • 浮點(diǎn)數(shù)f32f64,默認(rèn)使用 f64;
    • 布爾bool,僅有 truefalse;
    • 字符char,占 4 字節(jié),可表示 Unicode Scalar Value。
  • 復(fù)合類型
    • 元組:可含多種類型,長(zhǎng)度固定;可用解構(gòu)或索引方式訪問(wèn);
    • 數(shù)組:同類型元素的集合,長(zhǎng)度固定,存儲(chǔ)于棧上。

對(duì)于新手而言,遇到無(wú)法自動(dòng)推斷類型的情形時(shí),需要加上類型注解,尤其是在使用 parse 或其他需要指明具體數(shù)值類型的場(chǎng)景下。隨著實(shí)踐的深入,Rust 提供的多種安全檢查機(jī)制(如整數(shù)溢出檢查、數(shù)組越界檢查等)會(huì)給予你更多信心和安全感,同時(shí)也需要你熟悉這些機(jī)制以寫(xiě)出高效且安全的代碼。

在后續(xù)章節(jié)中,我們將會(huì)不斷深入 Rust 的特性,包括所有權(quán)、引用與切片、集合類型(向量、字符串、哈希映射)以及錯(cuò)誤處理等,希望你能繼續(xù)保持對(duì) Rust 的探索與學(xué)習(xí)。

參考與致謝

  • The Rust Programming Language - By Steve Klabnik and Carol Nichols, CC BY 4.0
  • 本文部分內(nèi)容基于其翻譯和改寫(xiě),如需了解更多細(xì)節(jié),請(qǐng)閱讀官方文檔。

到此這篇關(guān)于Rust 數(shù)據(jù)類型詳解的文章就介紹到這了,更多相關(guān)Rust 數(shù)據(jù)類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Rust 函數(shù)詳解

    Rust 函數(shù)詳解

    函數(shù)在 Rust 語(yǔ)言中是普遍存在的。Rust 支持多種編程范式,但更偏向于函數(shù)式,函數(shù)在 Rust 中是“一等公民”,函數(shù)可以作為數(shù)據(jù)在程序中進(jìn)行傳遞,對(duì)Rust 函數(shù)相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-11-11
  • Rust?中?Mutex?的基本用法

    Rust?中?Mutex?的基本用法

    Rust?標(biāo)準(zhǔn)庫(kù)中的?Mutex?結(jié)構(gòu)體位于?std::sync::Mutex?中,它提供了線程安全的數(shù)據(jù)訪問(wèn),Mutex?保證了在同一時(shí)間只有一個(gè)線程可以訪問(wèn)被鎖定的數(shù)據(jù),這篇文章主要介紹了Rust?中?Mutex?的基本用法,需要的朋友可以參考下
    2024-05-05
  • Rust 智能指針實(shí)現(xiàn)方法

    Rust 智能指針實(shí)現(xiàn)方法

    這篇文章主要介紹了Rust 智能指針的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • 如何在Rust中處理命令行參數(shù)和環(huán)境變量

    如何在Rust中處理命令行參數(shù)和環(huán)境變量

    在本章節(jié)中, 我們探討了Rust處理命令行參數(shù)的常見(jiàn)的兩種方式和處理環(huán)境變量的兩種常見(jiàn)方式,感興趣的朋友一起看看吧
    2023-12-12
  • Windows系統(tǒng)下安裝Rust環(huán)境超詳細(xì)教程

    Windows系統(tǒng)下安裝Rust環(huán)境超詳細(xì)教程

    這篇文章主要介紹了如何在Windows系統(tǒng)上安裝mingw64和Rust,mingw64是一個(gè)輕便的C語(yǔ)言編譯環(huán)境,可以替代Rust默認(rèn)使用的Visual?Studio,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02
  • 前端基于Rust實(shí)現(xiàn)的Wasm進(jìn)行圖片壓縮的技術(shù)文檔(實(shí)現(xiàn)方案)

    前端基于Rust實(shí)現(xiàn)的Wasm進(jìn)行圖片壓縮的技術(shù)文檔(實(shí)現(xiàn)方案)

    在現(xiàn)代Web開(kāi)發(fā)中,利用Rust編寫(xiě)的圖片壓縮代碼可以編譯成WebAssembly(Wasm)模塊,Rust的內(nèi)存安全特性和Wasm的跨平臺(tái)能力,使得這種方案既高效又安全,對(duì)Rust?Wasm圖片壓縮實(shí)現(xiàn)方案感興趣的朋友一起看看吧
    2024-09-09
  • Rust動(dòng)態(tài)調(diào)用字符串定義的Rhai函數(shù)方式

    Rust動(dòng)態(tài)調(diào)用字符串定義的Rhai函數(shù)方式

    Rust中使用Rhai動(dòng)態(tài)調(diào)用字符串定義的函數(shù),通過(guò)eval_expression_with_scope實(shí)現(xiàn),但參數(shù)傳遞和函數(shù)名處理有局限性,使用FnCall功能更健壯,但更復(fù)雜,總結(jié)提供了更通用的方法,但需要處理更多錯(cuò)誤情況
    2025-02-02
  • Rust中的引用與借用舉例詳解

    Rust中的引用與借用舉例詳解

    這篇文章主要給大家介紹了關(guān)于Rust中引用與借用的相關(guān)資料,rust中借用和引用的附帶功效都一樣,就是都有生命周期,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Rust具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-11-11
  • libbpf和Rust開(kāi)發(fā)ebpf程序?qū)崙?zhàn)示例

    libbpf和Rust開(kāi)發(fā)ebpf程序?qū)崙?zhàn)示例

    這篇文章主要為大家介紹了libbpf和Rust開(kāi)發(fā)ebpf程序?qū)崙?zhàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 詳解Rust中的變量與常量

    詳解Rust中的變量與常量

    大多數(shù)嘗試過(guò) Rust 的人都希望繼續(xù)使用它。但是如果你沒(méi)有使用過(guò)它,你可能會(huì)想——什么是 Rust,如何理解Rust中的變量與常量,感興趣的朋友跟隨小編一起看看吧
    2022-10-10

最新評(píng)論

白朗县| 潼南县| 澄迈县| 陇南市| 石城县| 民县| 龙胜| 临清市| 常州市| 星座| 双辽市| 万荣县| 乌兰察布市| 抚松县| 图片| 岳阳县| 宁波市| 尉犁县| 博白县| 蒙城县| 墨脱县| 凤台县| 吉隆县| 福清市| 渝北区| 元氏县| 乐昌市| 洛川县| 青海省| 南漳县| 祁连县| 娄烦县| 扬州市| 鄂州市| 沾益县| 陇西县| 永年县| 左权县| 安庆市| 白山市| 汪清县|