具体的网站建设方案,网页程序开发采购,微信公众号文章怎么转换wordpress,淮安建设机械网站制作Rust之抽空学习系列#xff08;三#xff09;—— 编程通用概念#xff08;中#xff09;
1、变量可变性
在Rust中#xff0c;变量默认是不可变的
fn main() {let x 5;println!(x is {}, x);
}使用let来声明一个变量#xff0c;此时变量默认是不可变…Rust之抽空学习系列三—— 编程通用概念中
1、变量可变性
在Rust中变量默认是不可变的
fn main() {let x 5;println!(x is {}, x);
}使用let来声明一个变量此时变量默认是不可变的因此x的值是5如果修改就会发生报错 想要再次将x赋值为6时编译报错了提示无法对不可变的变量x两次赋值并且还贴心地标注了两次赋值发生的位置也给出了修改建议让我们考虑使用mut来绑定变量x
这个不可变变量的感觉就像是Java中的final修饰的变量或者是Kotlin中val声明的变量仅仅是赋值一次而后不可修改
而将变量声明为可变就要用到刚刚建议里提及的mut关键字了
fn main() {let mut x 5; // 声明为可变x 6;println!(x is {}, x);
}此时代码正常运行输出6可变的需要开发者自己来添加这无形中也是倒逼开发者去思考设置可变的用途和必要性
在Rust中不可变的行为是默认的而可变的行为需要开发者自己指定这也是安全性的体现
2、常量
在Rust中常量是使用const关键字来进行声明的
但是在进行常量声明的时候有一些需要注意的内容
不可以使用mut必须标注类型可在任意作用域内声明仅可以使用常量表达式赋值
不能使用mut很好理解了本身常量和变量就是矛盾的嘛 使用常量表达式进行赋值的原因是由于它们能够在编译时被计算出来
fn main() {const MAX_POINTS: u32 100000; // 指明类型const ONE_HOUR: u32 60 * 60; // 常量表达式println!(The maximum number of points is {}, MAX_POINTS);
}
const MY_NAME: str John; // 任何作用域3、变量遮蔽
变量遮蔽指的是新声明的变量覆盖了旧的同名变量
fn main() {let x 5;let x x 1; // 6let x x * 2; // 12println!(The value of x is: {}, x);
}使用变量遮蔽与将变量声明为mut是不同的使用变量遮蔽声明的新变量依旧是不可变的只不过相当于是用来保存新的数据了除此以外变量遮蔽甚至还可以修改变量的类型请牢记这是新的变量
那么此时我就想到一个场景很适合使用这个特性 比方说在实际业务当中后端接口返回了一个时间戳表示的长串数字前端需要以yyyy-MM-dd这样的格式展示这样的话通常我们是这样处理的
fn main() {let date 1677386710000; // 可能是精确到毫秒的let formatedDate get_formated_date_str(date, yyyy-MM-dd);println!(formatedDate: {}, formatedDate);
}此时我们产生了一个中间变量date但是它仅仅在这里用于转换我们真正要显示的其实是formatedDate那么我们可以借助变量遮蔽稍微修改下
fn main() {let date 1677386710000; // 1.0版本 原材料let date get_formated_date_str(date); // 2.0版本 加工上市的成品println!(formatedDate: {}, formatedDate);
}使用变量遮蔽就可以将同一个或一类的内容的加工作为多个版本最后用到的那一版作为结果
帮忙省去了那些命名费解、存在又很尴尬的临时量使得代码的业务逻辑主线更加清晰
4、数据类型
4.1、标量类型
标量类型作为单个值类型的统称 Rust内部定义了4种基础的标量类型
整数浮点数布尔值字符
4.1.1、整数类型
整数类型表示的就是不包含小数部分的整数其中分为有符号和无符号
无符号数始终不为负开头使用u区别比如u32 有符号数通过二进制补码的形式来存储
以下是关于各个类型的整数类型所能够表示的范围 除了直接指明描述位数的类型像i32u32还有isize和usize两种特殊的类型它们的长度取决于程序运行的目标平台
字面量
整数的字面量可以有多种形式呈现
整数溢出
整数溢出主要是由于存储的数超出类型的限制就像往桶里倒水一样
在debug模式下发生整数溢出会抛出panic
let big: u8 255;
let small 3;
let result small big; // 会发生溢出
print!(结果{}, result)很明显255已经是u8的极限了 程序发现这个算术运算有溢出的风险立马抛出错误中止执行
4.1.2、浮点类型
Rust提供了两种基础的浮点数类型f32f64
在Rust中浮点类型默认会被推导为f64类型因其在现代CPU执行中相较于f32有更高精度执行效率也相差无几 使用f32需要显式进行指定
Rust中的f32和f64对应的就是IEEE-754标准中的单精度浮点数和双精度浮点数
4.1.3、布尔类型
布尔类型与其他语言是一样的也是true和false两个值并且仅占据一个字节
在条件表达式等控制语句中会有大量的出场
4.1.4、字符类型
字符类型用以描述单个字符 char类型占4个字节的空间并且是一个Unicode标量值
4.2、复合类型
在Rust当中复合类型表示将不同的类型组合为一个类型
在Rust当中提供了两种基础的复合类型
元组tuple数组array
4.2.1、元组类型
元组能够将多个不同类型的值组合进一个类型但是一旦声明结束便不可修改元素的数量
let tup: (i32, char, bool) (15, A, false); // 声明如果需要对于其中的元素进行访问可以使用解构的方式
let (a, b, c) tup; // 几个变量将和里面的元素对应上 比如a: 15, b: A, c: false除了解构的方式元组还可以支持使用.配合索引的方式对元组内部的元素进行访问
let tup: (i32, char, bool) (15, A, false);
print!({}, tup.1); // 下标从0开始4.2.2、数组类型
数组有固定的长度而且数组中的各个元素必须为相同的类型
let list: [char; 3] [A, B, C]; // 前面是类型后面是长度
let zeros [0; 5]; // 长度为5都是0数组的声明可以使用[]根据类型和长度初始化也可以指定默认值和长度
数组的访问和其他语言也几乎没有什么不同
print!(元素2{}, zeros[1]);数组对应的是内存栈中一块连续的内存
另外提到数组就不得不说一个名为数组越界的问题
fn main() {let zeros [0; 5];print!(元素9{}, zeros[8]); // 必定越界
}将索引修改为一个没有的量无法访问到这样在程序执行的过程中会抛出panic进而中止了程序的运行 https://kaisery.github.io/trpl-zh-cn/ch03-01-variables-and-mutability.html https://www.bilibili.com/video/BV1182ZYhEdV