1、变量
RUST声明局部变量的关键字是let,声明全局变量的关键字是static,声明常量的关键字是const。值得注意的是,RUST的变量是默认不可变的,什么意思呢?就是通过let和static声明后的变量在初始化后它的值不可变,比如:
let num = 10;
num = 11 //初始化后再去赋值是错误的,因为num已经和10绑定
运行后提示这样的错误:
这算是RUST的一种特性设计,官方的解释如下:
当我们尝试更改指定为不可变的值时,我们会遇到编译时错误,这一点很重要,因为这种情况可能会导致错误。如果我们的代码的一部分在假设值永远不会改变的情况下运行,而代码的另一部分更改了该值,则代码的第一部分可能不会执行其设计目的。事后很难追查这种错误的原因,尤其是当第二段代码有时只更改值时。Rust 编译器保证当你声明一个值不会改变时,它确实不会改变,所以你不必自己跟踪它。因此,您的代码更容易推理。
这也许就是RUST安全特性的原因之一吧。当然也不是完全不可变,RUST提供了两种可变的方式,一是通过mut关键字来修饰,二是通过重影机制。
/* mut关键字 */
let mut num = 10;
num = 11; //这样再赋值是正确的
/* 重影机制 */
let num = 10;
let num = 11; //相当于重新绑定
/* 二者的不同在于mut只限于可变值,重影的数据类型、可变属性、值均可变 */
let mut str = "___"
str = str.len() //这种写法是错的
虽然RUST具有自动判断变量类型的能力,但是在定义声明全局变量和常量的时候还是需要手动声明变量类型,语法如下:
static num: i32 = 10;
const num: i32 = 10;
2、数据类型
- 整数型
长度 | 有符号 | 无符号 |
---|---|---|
8-bit | i8 | u8 |
16-bit | i16 | u16 |
32-bit | i32 | u32 |
64-bit | i64 | u64 |
128-bit | i128 | u128 |
arch | isize | usize |
isize和usize类型取决于程序运行所在计算机的体系结构,如果使用的是64位架构则为64位,32位架构则为32位。
- RUST中整数的表示方法
字面常量数字 | 例子 |
---|---|
十进制 | 98_222 |
十六进制 | 0xff |
八进制 | 0o77 |
二进制 | 0b1111_0000 |
字节(仅支持u8) | b’A’ |
RUST还支持在数字常量后使用类型后缀(例如57u8)来指定类型,同时还可以使用"_"分隔符将数字隔开以便更好阅读,比如1_000和1000是等价的。
- 浮点数型
RUST同样支持32位浮点数和64位浮点数,默认情况下是64位浮点数,因为它们二者运行速度相同,但64位精度更高。
fn main() {
let x = 2.0; // 64位浮点数
let y: f32 = 3.0; // 32位浮点数
}
- 数值运算
RUST支持所有数字类型的基本数学运算:
fn main() {
// addition
let sum = 5 + 10;
// subtraction
let difference = 95.5 - 4.3;
// multiplication
let product = 4 * 30;
// division
let quotient = 56.7 / 32.2;
let truncated = -5 / 3; // results in -1
// remainder
let remainder = 43 % 5;
}
- 布尔类型
fn main() {
let t = true;
let f: bool = false; // with explicit type annotation
- 字符型
RUST中字符型用char表示,大小为4个字节,表示Unicode标量值,这意味着它可以表示的不仅仅是ASCII字符,包括重音符号、中文、日文、韩文字符、表情符号和零宽度空格都是RUST中有效的char值。
fn main() {
let c = 'z';
let z: char = 'ℤ'; // with explicit type annotation
let heart_eyed_cat = '😻';
}
- 复合类型之元组类型
元组是将具有多种类型的多个值组合在一起形成一个复合类型的通用方法,元组有固定的长度,一旦声明,它们的长度大小就不能再增长或缩小。通过在括号内写入逗号分隔的值列表来创建一个元组。元组中的每个位置都有一个类型,并且元组中不同值的类型不必相同。
fn main() {
let tup: (i32, f64, u8) = (500, 6.4, 1); // 没有强制指定类型
}
可以使用模式匹配来解构元组值也可以使用句点( . )后跟要访问的值的索引来直接访问元组元素。没有任何值的元组有一个特殊的名称:unit,该元组的值及其对应的类型都被写入()并表示空值或空返回类型。
fn main() {
let tup = (500, 6.4, 1);
let (x, y, z) = tup;
println!("The value of y is: {y}");
/* 或者可以使用下面这种 */
let five_hundred = tup.0;
let six_point_four = tup.1;
let one = tup.2
println!("The value of one is: {one}");
}
- 复合类型之数组
RUST数组是多个具有相同类型的值的组合,长度大小也是固定的。数组使用[元素类型; 元素数量]来指定数组类型。
let a: [i32; 5] = [1, 2, 3, 4, 5]; // 表示数组a的数据类型为i32,长度为5
数组的初始化有两种方式,可以使用[初始值; 元素数量]也可以直接往方括号里写值。下面两种方式等价。
let a = [3; 5];
let a = [3, 3, 3, 3, 3];
RUST数组的访问方式和其他语言一样,都采用索引的方式,值得注意的是,如果想要修改数组元素的值,需先得将数组定义为可变数组即加mut关键字,因为数组首先是一个变量。
先这样啦…