Rust数据类型


类型系统表示语言支持的数据类型,类型系统在值被程序操作之前检查其有效性,这样可以确保代码符合预期,类型系统还允许更丰富的代码提示和自动化文档。

Rust是一种静态类型的语言,每个值都属于某种数据类型,编译器可以根据值的类型自动推断变量的数据类型。

声明一个变量


使用let关键字声明变量。

fn main() {
    let company_string = "newbiego.com";  //字符串类型
    let rating_float = 4.5;                 //浮点类型
    let is_growing_boolean = true;          //布尔类型
    let icon_char = '♥';                    // Unicode字符类型

    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: newbiego.com
company rating on 5 is:4.5
company is growing: true
company icon is: ♥

标量类型


标量类型表示单个值,例如10、3.14、'c'。

Rust具有四种主要的标量类型:

  • 整型

  • 浮点

  • 布尔

  • 字符

整型


整数是没有小数部分的数字,简而言之,整数数据类型用于表示整数。

整数可以进一步分为有符号和无符号,有符号整数可以存储负值和正值,无符号整数只能存储正值,下面给出整数类型的详细说明:

序号大小有符号无符号
18 biti8u8
216 biti16u16
332 biti32u32
464 biti64u64
5128 biti128u128
6Archisizeusize

整数的大小可以是 arch,这意味着数据类型的大小由机器架构决定。例如一个整数的大小在x86机器上为32位,在x64机器上为64位。

fn main() {
    let result = 10;    //默认情况下为i32
    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 to (2^n)-1 。例如,u8可以存储 0 到 2^7 ,它等于0到255。

整数溢出

当分配给整数变量的值超过该数据类型的Rust定义范围时,就会发生整数溢出。让我们通过一个例子来理解这一点:

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

    //仅u8允许使用0到255
    let weight:u8 = 256;   //溢出值为0
    let height:u8 = 257;   //溢出值为1
    let score:u8 = 258;    //溢出值为2

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

无符号u8变量的有效范围是0到255。在上面的示例中,为变量分配的值大于255(Rust中整数变量的上限)。执行后,以上代码将返回警告:警告:u8字面量超出范围体重、身高和得分变量。 255之后的溢出值将从0、1、2等开始。无警告的最终输出如下所示:

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

浮点


Rust中的float类型可以分类为f32f64。 f32类型是单精度浮点,而f64具有双精度,默认类型为f64。

考虑以下示例,以了解有关float数据类型的更多信息:

fn main() {
    let result = 10.00;        //默认情况下为f64
    let interest:f32 = 8.35;
    let cost:f64 = 15000.600;  //双精度
   
    println!("result value is {}",result);
    println!("interest is {}",interest);
    println!("cost is {}",cost);
}

输出结果如下图:

interest is 8.35
cost is 15000.6

自动类型转换

Rust不允许自动类型转换,考虑以下代码片段,整数值分配给float变量interest:

fn main() {
    let interest:f32 = 8;   //分配给float变量的整数
    println!("interest is {}",interest);
}

编译器抛出类型不匹配错误如下所示:

error[E0308]: mismatched types
    --> main.rsRust是一种静态类型的语言。 Rust中的每个值都是某种数据类型。编译器可以根据分配给它的值自动推断变量的数据类型。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

布尔


布尔类型有两个可能的值:true 或者 false ,使用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 = '@'; // 默认
    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 ?