• 【一起学Rust 基础篇】Rust基础——变量和数据类型


    目录

    前言

    一、定义变量

    二、Rust变量的可变性

    ?编辑

    三、Rust基本数据类型

    1.数值类型

    整型

    浮点型

    2.字符类型

    3.布尔类型

    四、复合类型

    元组

    数组

    五、常量

    总结

    作业

    变量只有初始化了才可以使用

    使用?mut?将变量标记为可变

    变量解构


    前言

    经过前面几期的学习,大家应该对Rust已经有了个初步的了解。现在我们将从Rust的基础开始学习。

    变量是一个编程语言必要的内容,学习任何一门编程语言都离不开变量,而是基础中的基础,学习Rust也是这样的。本期我们将从Rust变量的概念开始讲起,同时搭配编程案例,辅以作业,帮助大家学习和理解Rust的变量基础概念。


    一、定义变量

    Rust定义变量需要使用关键词let,这点和Javascript是一致的,如果你有JS开发的经验,那你应该很熟悉。现在我们定义几个变量

    let x = 5;
    let y = 5.0;
    let str = String::from("Hello");
    
    • 1
    • 2
    • 3

    以上的几个变量都是没有问题的,定义了三个变量,x是整数型的,y是浮点型的,z是字符串型的。除此以外,Rust还支持指定变量类型来定义变量

    let x: i32 = 5;
    let y: f64 = 5.0;
    let str: String = String::from("Hello");
    
    • 1
    • 2
    • 3

    其实我们并不是一定得指定类型,因为Rust可以自动推断你使用的是哪种类型。

    二、Rust变量的可变性

    在Rust中,变量默认是不可变的。如果你写了如下代码,就会报错

    fn main() {
        let x = 5;
        println!("The value of x is: {x}");
        x = 6;
        println!("The value of x is: {x}");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    报错如下

    现在我们分析一下这个报错,首先看红色的报错,翻译过来的意思是,不可变的变量不可以赋值两次。意思就是不可变的变量不能再次赋值。

    然后我们看蓝色的部分,第一次给x分配值,帮助:考虑使x变得可变,`mut x`。可以看出,蓝色的部分是帮助我们修改这个错误的,这也是Rust比较强大的地方之一。按照这个提示,我们应该这么改,

        let mut x: i32 = 5;
        print!("The value of x is: {}", x);
        x = 6;
        print!("The value of x is: {}", x);
    
    • 1
    • 2
    • 3
    • 4

    此时我们继续运行看看,

    因此我们得出结论,Rust的变量默认是不可变的,只有添加mut关键字以后才会变得可变。

    三、Rust基本数据类型

    1.数值类型

    数值类型又分为整数型、浮点数、序列类型。

    整型

    长度

    有符号

    无符号

    8-bit

    i8

    u8

    16-bit

    i16

    u16

    32-bit

    i32

    u32

    64-bit

    i64

    u64

    128-bit

    i128

    u128

    arch

    isize

    usize

    其中,每个长度都有有符号和无符号两种,有符号表示这个数分正数和负数,无符号则表示这个数据类型只有正数。

    有符号的整型取值范围是

    其中n是长度。

    另外,isizeusize类型依赖运行程序的计算机架构:64 位架构上它们是 64 位的, 32 位架构上它们是 32 位的。

    同时也支持用不同的形式表示不同进制的字面量。

    数字字面值

    例子

    Decimal (十进制)

    98_222

    Hex (十六进制)

    0xff

    Octal (八进制)

    0o77

    Binary (二进制)

    0b1111_0000

    Byte (单字节字符)(仅限于u8)

    b'A'

    浮点型

    Rust 也有两个原生的浮点数类型,它们是带小数点的数字。Rust 的浮点数类型是f32f64,分别占 32 位和 64 位。浮点数采用 IEEE-754 标准表示。f32是单精度浮点数,f64是双精度浮点数。默认类型是f64,因为在现代 CPU 中,它与f32速度几乎一样,不过精度更高。所有的浮点型都是有符号的。以下是使用浮点型的实例。

    fn main() {
        let x = 2.0; // f64
    
        let y: f32 = 3.0; // f32
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.字符类型

    和C语言一样,char也是Rust的原生类型。但是与之不同的是,Rust的char类型是Unicode的,支持更多的字符,以下是使用字符类型的例子,(如果你能复制到梵文,连梵文也能编码了。)

    fn main() {
        let c = 'z';
        let z: char = '?'; // 指定变量类型
        let heart_eyed_cat = '??';
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    要注意分清楚字符和字符串,字符使用的是单引号,字符串使用的是双引号。

    3.布尔类型

    Rust 中的布尔类型有两个可能的值:truefalse。Rust 中的布尔类型使用bool表示。例如:

    fn main() {
        let t = true;
    
        let f: bool = false; // 指定变量类型
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    四、复合类型

    复合类型可以将多个值组合成一个类型。Rust 有两个原生的复合类型:元组(tuple)和数组(array)。

    元组

    元组是一个将多个其他类型的值组合进一个复合类型的主要方式。可以将多个不同类型的值进行复合,但是元组长度固定:一旦声明,其长度不会增大或缩小。

    fn main() {
        let tup1 = (500, 6.4, 1);
        let tup2: (i32, f64, u8) = (500, 6.4, 1); // 指定类型
    }
    
    • 1
    • 2
    • 3
    • 4

    同时元组也支持解构操作

    fn main() {
        let tup = (500, 6.4, 1);
    
        let (x, y, z) = tup;
    
        println!("y的值是: {y}");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    访问元组的值是使用元素在元组中的索引来访问的,索引是从0开始的,与数组是一样的

    fn main() {
        let x: (i32, f64, u8) = (500, 6.4, 1);
    
        let x1 = x.0;
    
        let x2 = x.1;
    
        let x3 = x.2;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    数组

    与元组不同,数组中的每个元素的类型必须相同。Rust 中的数组与一些其他语言中的数组不同,Rust中的数组长度是固定的。使用方式如下

    fn main() {
        let a = [1, 2, 3, 4, 5];
        let months = ["January", "February", "March", "April", "May", "June", "July",
                  "August", "September", "October", "November", "December"];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    同时也可以指定元素类型

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

    如果初始化数组里面的值都是一样的,那么就有种简便的写法,如下,创建了一个数组a,其中有5个元素,这五个元素都是整数型3

    let a = [3; 5];
    
    • 1

    访问数组中的元素也是同其他编程语言一样

    fn main() {
        let a = [1, 2, 3, 4, 5];
    
        let a1 = a[0];
        let a2 = a[1];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    但是要注意,不要尝试越界访问数组元素,也就是说,要访问数组长度内的元素。

    五、常量

    常量与不可变量是类似的,但是是不同的。_常量(constants)_是绑定到一个名称的不允许改变的值。

    • 不可变量是默认不可变
    • 常量是总是不能变
    • 常量可以在任何作用域中声明
    • 常量只能被设置为常量表达式,而不可以是其他任何只能在运行时计算出的值

    申明一个常量要用const

    fn main() {
    const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
    }
    
    • 1
    • 2
    • 3

    总结

    以上就是本期所要讲述的内容了。本期主要讲了

    • 变量的定义
    • 变量的可变性
    • 基本变量类型
      • 整型
      • 布尔型
      • 字符型
    • 复合型
      • 数组
      • 元组
    • 常量

    虽然很努力的组织内容了,但还是感觉不是很合理,在后期一定要调整,方便新手入门,让更多人能够学到Rust。

    作业

    完成以下作业是你学好rust的重要组成部分。以下题目摘自《Rust练习实践》

    变量只有初始化了才可以使用

    // 修复下面代码的错误并尽可能少的修改
    fn main() {
        let x: i32; // 未初始化,但被使用
        let y: i32; // 未初始化,也未被使用
        println!("x is equal to {}", x); 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    使用mut将变量标记为可变

    // 完形填空,让代码编译
    fn main() {
        let __ = 1;
        __ += 2; 
        
        println!("x = {}", x); 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    变量解构

    // 修复下面代码的错误并尽可能少的修改
    fn main() {
        let (x, y) = (1, 2);
        x += 2;
    
        assert_eq!(x, 3);
        assert_eq!(y, 2);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    华大芯片HC32L110C6PA(探索)
    小米将推出中端手机,高通骁龙7系列再添一员,能否吸引消费者?
    初识搜索:百度搜索产品经理的第一课
    PB从入坑到放弃(一)第一个HelloWorld程序
    DateTime和DateTimeOffset是同胞兄弟吗?
    centos常见的命令
    BigDecimal不会丢失精度的浮点数
    Android:自定义列表弹窗的单选图标样式、去掉列表弹窗的上下提示线
    网卡中断对cpu的不同绑定方式对Redis性能的影响
    Docker搭建ctfd平台
  • 原文地址:https://blog.csdn.net/m0_67391683/article/details/126080704