Rust - 資料型別



型別系統表示語言支援的不同值型別。在程式儲存或操作值之前,型別系統會檢查值的有效性。這確保程式碼按預期執行。型別系統還可以提供更豐富的程式碼提示和自動化文件。

Rust 是一種靜態型別語言。Rust 中的每個值都具有某種資料型別。編譯器可以根據分配給變數的值自動推斷變數的資料型別。

宣告變數

使用let關鍵字宣告變數。

fn main() {
   let company_string = "TutorialsPoint";  // string type
   let rating_float = 4.5;                 // float type
   let is_growing_boolean = true;          // boolean type
   let icon_char = '♥';                    //unicode character type

   println!("company name is:{}",company_string);
   println!("company rating on 5 is:{}",rating_float);
   println!("company is growing :{}",is_growing_boolean);
   println!("company icon is:{}",icon_char);
}

在上面的示例中,變數的資料型別將根據分配給它們的值推斷得出。例如,Rust 將字串資料型別分配給變數company_string,浮點資料型別分配給rating_float等。

println!宏接受兩個引數:

  • 特殊的語法{ },它是佔位符
  • 變數名或常量

佔位符將被變數的值替換

上述程式碼片段的輸出將是:

company name is: TutorialsPoint
company rating on 5 is:4.5
company is growing: true
company icon is: ♥

標量型別

標量型別表示單個值。例如,10、3.14、'c'。Rust 有四種主要的標量型別。

  • 整數
  • 浮點數
  • 布林值
  • 字元

我們將在後續章節中學習每種型別。

整數

整數是沒有小數部分的數字。簡單來說,整數資料型別用於表示整數。

整數可以進一步分類為有符號和無符號整數。有符號整數可以儲存負值和正值。無符號整數只能儲存正值。下面是整數型別的詳細描述:

序號 大小 有符號 無符號
1 8 位 i8 u8
2 16 位 i16 u16
3 32 位 i32 u32
4 64 位 i64 u64
5 128 位 i128 u128
6 架構相關 isize usize

整數的大小可以是架構相關的。這意味著資料型別的大小將從機器的架構派生。大小為架構相關的整數在 x86 機器上為 32 位,在 x64 機器上為 64 位。架構相關的整數主要用於索引某種集合。

示例

fn main() {
   let result = 10;    // i32 by default
   let age:u32 = 20;
   let sum:i32 = 5-15;
   let mark:isize = 10;
   let count:usize = 30;
   println!("result value is {}",result);
   println!("sum is {} and age is {}",sum,age);
   println!("mark is {} and count is {}",mark,count);
}

輸出如下:

result value is 10
sum is -10 and age is 20
mark is 10 and count is 30

如果你將age的值替換為浮點數,上面的程式碼將返回編譯錯誤。

整數範圍

每個有符號變體可以儲存從-(2^(n-1)) 到 2^(n-1) -1的數字,其中 n 是該變體使用的位數。例如,i8 可以儲存從-(2^7) 到 2^7 -1的數字——這裡我們將n替換為 8。

每個無符號變體可以儲存從0(2^n)-1的數字。例如,u8 可以儲存從0(2^8)-1的數字,即 0 到 255。

整數溢位

當分配給整數變數的值超過 Rust 為該資料型別定義的範圍時,就會發生整數溢位。讓我們用一個例子來理解這一點:

fn main() {
   let age:u8 = 255;

   // 0 to 255 only allowed for u8
   let weight:u8 = 256;   //overflow value is 0
   let height:u8 = 257;   //overflow value is 1
   let score:u8 = 258;    //overflow value is 2

   println!("age is {} ",age);
   println!("weight is {}",weight);
   println!("height is {}",height);
   println!("score is {}",score);
}

無符號 u8 變數的有效範圍是 0 到 255。在上面的示例中,變數被賦值大於 255(Rust 中整數變數的上限)的值。執行時,上述程式碼將返回警告:警告 - u8 超出範圍的字面量(針對 weight、height 和 score 變數)。超過 255 的溢位值將從 0、1、2 等開始。最終的輸出(不含警告)如下所示:

age is 255
weight is 0
height is 1
score is 2

浮點數

Rust 中的浮點資料型別可以分類為f32f64。f32 型別是單精度浮點數,f64 是雙精度浮點數。預設型別是 f64。考慮以下示例以瞭解有關浮點資料型別的更多資訊。

fn main() {
   let result = 10.00;        //f64 by default
   let interest:f32 = 8.35;
   let cost:f64 = 15000.600;  //double precision
   
   println!("result value is {}",result);
   println!("interest is {}",interest);
   println!("cost is {}",cost);
}

輸出如下所示:

interest is 8.35
cost is 15000.6

自動型別轉換

Rust 不允許自動型別轉換。考慮以下程式碼片段。整數的值被賦值給浮點變數interest

fn main() {
   let interest:f32 = 8;   // integer assigned to float variable
   println!("interest is {}",interest);
}

編譯器會丟擲一個如下所示的型別不匹配錯誤

error[E0308]: mismatched types
   --> main.rs:2:22
   |
 2 | let interest:f32=8;
   |    ^ expected f32, found integral variable
   |
   = note: expected type `f32`
      found type `{integer}`
error: aborting due to previous error(s)

數字分隔符

為了方便閱讀大數字,我們可以使用視覺分隔符 _ 下劃線來分隔數字。也就是說,50,000 可以寫成 50_000。這在下面的示例中顯示。

fn main() {
   let float_with_separator = 11_000.555_001;
   println!("float value {}",float_with_separator);
   
   let int_with_separator = 50_000;
   println!("int value {}",int_with_separator);
}

輸出如下所示:

float value 11000.555001
int value 50000

布林值

布林型別有兩個可能的值——truefalse。使用bool關鍵字宣告布林變數。

示例

fn main() {
   let isfun:bool = true;
   println!("Is Rust Programming Fun ? {}",isfun);
}

上述程式碼的輸出將是:

Is Rust Programming Fun ? true

字元

Rust 中的字元資料型別支援數字、字母、Unicode 和特殊字元。使用char關鍵字宣告字元資料型別的變數。Rust 的 char 型別表示 Unicode 標量值,這意味著它可以表示的遠不止 ASCII 字元。Unicode 標量值的範圍是從U+0000U+D7FFU+E000U+10FFFF(包含)。

讓我們考慮一個例子來了解有關字元資料型別的更多資訊。

fn main() {
   let special_character = '@'; //default
   let alphabet:char = 'A';
   let emoji:char = '😁';
   
   println!("special character is {}",special_character);
   println!("alphabet is {}",alphabet);
   println!("emoji is {}",emoji);
}

上述程式碼的輸出將是:

special character is @
alphabet is A
emoji is 😁
廣告