蜘蛛爬网站,蚂蚁中国网站建设,苏州网站设计哪家公司好,网站交易平台怎么注册目录 前言
变量绑定
变量遮蔽
常量
基本数据类型
复合数据类型
#xff08;1#xff09;元组类型
#xff08;2#xff09;数组类型
#xff08;3#xff09;结构体类型
#xff08;4#xff09;枚举类型
总结 前言
上一课是rust的入门第一课#xff0c;介…目录 前言
变量绑定
变量遮蔽
常量
基本数据类型
复合数据类型
1元组类型
2数组类型
3结构体类型
4枚举类型
总结 前言
上一课是rust的入门第一课介绍了rust的安装和cargo新建rust项目这节课我们来了解一下rust的变量和数据类型rust的变量和其他编程语言略有不同我们在这一节细说。
在开始介绍之前我们使用cargo创建项目来编写本节课的代码
cargo init lesson2
使用vscode打开
变量绑定
rust中的变量分为可变和不可变其他的编程语言中也有这样的概念比如scala中使用val定义不可变变量var定义可变变量。不可变变量的含义是第一次赋值后无法第二次赋值可变变量则没有这样的限制。
这里需要注意和其他编程语言的变量赋值变量初始化不同在rust中这样的行为称为变量绑定即将变量名称和值绑定在一起这样做的原因和后面要介绍的所有权机制有很大关系rust中的所有权是一个很有意思的东西这里简单说一句每一块内存都只有一个主人当主人不在了这块内存也要交还。想一想垃圾回收是不是也在做这样一件事情java中jvm不断的寻找没有使用的内存然后回收这一块内存rust中的所有权机制使用另一种思路在解决垃圾回收的问题。
fn main() {let x 8;x 18;let y: i32 18;
}rust中使用let定义不可变变量变量名后可以跟数据类型也可以不跟编译器会自动推断数据类型对于不可变变量进行二次绑定值时会报错我们使用cargo build编译一下看看报错可以看到rust的编译器解释的非常详细第一次将8绑定给变量x不能把18第二次绑定给x甚至告诉我们使用mut修饰就解决问题了不得不感叹rust编译器的强大。 -- src/main.rs:3:5|
2 | let x 8;| - first assignment to x
3 | x 18;| ^^^^^^ cannot assign twice to immutable variable|
help: consider making this binding mutable|
2 | let mut x 8;|
fn main() {let mut x 8;x 18;
}rust中使用mut修饰可变变量可以在绑定值后再次修改变量重新绑定一个新值不过要注意重新绑定的值必须和变量的数据类型一致即x是i32类型第二次绑定值不可以绑定true/false这样的bool值。
变量遮蔽
变量遮蔽是rust中一个不同于其他语言的概念指的是在同一个作用域中可以再次声明一个之前已经声明过的变量名新的变量名会遮蔽之前的变量名之前的变量名不见了对于第一次学习rust的同学来说很难理解因为这是其他编程语言中没有的我们使用代码来解释一下继续坚持看下去。
fn main() {// 定义不可变量x给x绑定上内存中的值8let x 8;// 定义不可变量x给x绑定上内存中的值truelet x true;
}上面代码中我们使用let定义了2个同名的变量注意这里不是修改变量的值哦而是定义了2个不同的变量其中第一个变量x被第二个变量x遮蔽了所以既然是不同的变量数据类型也就可以不一样了因为这里是2块不同的内存和之前可变变量的二次绑定不一样之前的例子中x对应的内存里第一次存的是8后来存的是18而变量遮蔽中x对应的内存中第一个存的是8后面新定义了变量x对应的是一个新的内存该内存存的是true之前8所在的内存还存在并没有被修改。只是我们使用了相同的变量名称绑定了一块新的内存空间。那么变量遮蔽的作用是什么呢显而易见的可以在不改变变量名的情况下转换数据类型以及可变性。这也是rust安全性的体现如果想某个变量的值不再被访问那就重新定义一个同名的变量吧。
常量
和大部分编程语言的常量一样rust中常量使用const声明并且数据类型不能省略必须显式指出。
fn main() {const PI: f64 3.14;
}
基本数据类型
有编程语言基础的这一小节可以快速浏览用的时候不断巩固即可
1整型
2浮点型
3布尔型
4字符类型
5区间类型
范围类型我们说一说区间类型通常表示为一个表达式比如(1..5)表示左闭右开的区间[1,5)(1..5)表示左闭右闭的区间[1,5]这种在循环中或者初始化一段区间特别方便这种在别的编程语言也有体现比如在scala中使用 1 until 5表示左闭右开的区间使用1 to 5表示左闭右闭的区间在scala中这称之为Range。其他的基本类型大家自行了解简单看看就行多写写代码熟悉熟悉就好。
复合数据类型
1元组类型
元组tuple在大部分语言中都有长度固定类型可以不同元组的类型使用(i32, bool)表示括号中的类型表示元组中具体数据的类型。因为长度固定所以不能增删只能改查查询使用索引从0开始。元组是一个非常灵活好用的数据类型但是java8没有遇到这种情况就只能定义一个新的类。
fn main() {let mut t1: (i32, f64, bool) (1, 2.0, true);// 查println!(t1.0 {}, t1.0);// 改t1.0 18;// 定义只有一个元素的元组let t2 (3,);
}2数组类型
数组array在大部分语言中都有长度固定类型相同数组的类型使用[i32;5]表示分号前表示数组中元素的类型分号后表示数组的大小。
fn main() {let mut a1: [i32; 4] [1, 2, 3, 4];// 改a1[0] 5;// 查println!(a1[0]{}, a1[0]);// 数组的另外一种初始化方式let a2 [1; 5]; // [1,1,1,1,1]
}3结构体类型
结构体struct在java/scala这样面向对象的语言中一般用类表示但是类和结构题还是有区别的。结构体的定义和初始化都比较简单关于结构体的方法的使用和更高阶的用法我们放在面向对象去讲解这里只占一个坑结构体也是rust中的一种数据类型。
关于元组结构体我们也放到后面详述。
fn main() {let s1 Student {name: www.to_string(),age: 23,};
}// 定义
struct Student {name: String,age: i8,
}
4枚举类型
rust中的枚举非常强大语法和java等语言中枚举定义类似。下面代码定义了2个枚举类型一个带参数一个不带参数。rust中的枚举通常搭配模式匹配使用关于模式匹配我们在后面统一讲解这是一个非常强大的功能和scala中的模式匹配一样一旦用上了就爱不释手。
fn main() {let a1 LEVEL::A(1, 1.to_string());let a2 LEVEL::A(2, 2.to_string());
}// 定义
enum LEVEL {A(i32, String),B(i32, String),
}enum COLOR {RED,BLUE,
}总结
本节介绍了rust中的变量和数据类型需要重点理解有变量绑定变量遮蔽这两个概念其他的数据类型和复合数据类型简单过一遍即可不需要强制记住这些都是基本语法结合多年编程的经验来看基本语法多写写才能巩固靠看一遍就记住是很难得语言只是工具像变量绑定变量遮蔽代表的是rust设计者的思想很值得借鉴学习下一节会详细介绍rust中的容器类型集合映射等。