今天开始学rust

一、变量

1. let

不变的变量

let 是不可变的

let variable_name = value;

示例:

let x = 5;
println!("The value of x is: {}", x);
// x = 6; // 这行会引起编译错误,因为x是不可变的

2. let mut

会变得变量

mut 关键字来声明变量是可变的

let mut variable_name = value;

示例:

let mut y = 5;
println!("The value of y is: {}", y);
y = 10; // 正确,因为y是可变的
println!("The value of y is now: {}", y);

3. const

这次是真的常量

const 关键字用于声明一个常量常量类似于不可变变量,但有几个关键区别:

  • 常量不仅不可变,而且必须在编译时就已知其值
  • 常量可以在任何作用域内声明,包括全局作用域
  • 常量遵循与静态生命周期一致的规则,即它们的值始终存在

示例:

const MAX_POINTS: u32 = 100_000;
// 一般const就像这样全大写
println!("The maximum points are: {}", MAX_POINTS);

二、Rust 中的数据类型

Rust 中的数据类型主要分为两大类

标量类型复合类型

在创建变量时指定类型

let a = '2';
let b: char = '2';

这两一样的

const 必须声明类型

1. 标量类型

标量类型代表单一值Rust 有四种基本的标量类型:整数、浮点数、布尔值和字符

A. 整数类型:

  • 有符号整数(i8, i16, i32, i64, i128, isize)和无符号整数(u8, u16, u32, u64, u128, usize

B. 浮点类型:

  • f32:32 位浮点数
  • f64:64 位浮点数(默认)

C. 布尔类型:

  • bool:它有两个可能的值:truefalse

D. 字符类型:

  • char:表示单个 Unicode 标量值(比如一个字母或数字),存储为 4 个字节

字符串属于什么?

Answer:

在 Rust 中,字符串主要以两种形式出现:String 和字符串切片 &str

  1. String 类型

    • String 是一个可增长、可缩短、可变、拥有所有权的 UTF-8 编码字符串类型。
    • 它在堆上分配空间,因此可以存储在编译时未知大小的文本。
  2. 字符串切片 &str 类型

    • &str 是一个不可变的字符串切片,通常以字符串字面量的形式出现。
    • 字符串切片是固定大小的,不能被增长或缩短。

    示例:

    let d = "Hello";
    println!("{d} world!");
    let e = String::from("hello");
    println!("{e} world!");
    

    这两种字符串类型之间的主要区别在于所有权。String 是一个拥有所有权的类型,可以被修改和增长;而 &str 是一个借用类型,通常用于借用字符串的一部分。

2. 复合类型

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

A. 元组类型:

  • 长度固定
  • 类型可以不同
let a = (1, 2, 3, 4);
// 创建一个元组

let (b, c, d, e) = a;
println!("{}{}{}{}", b, c, d, e);
// 解构元组

println!("{}", a.0);
// 下标访问元组元素

B. 数组类型:

  • 类型相同
  • 长度固定
  • 数组在栈上分配,而不是在堆上
let x = [1,2,3];
// 创建一个数组

let [a,b,c] = x;
println!("{a}{b}{c}");
// 解构数组

println!("{}", x[1]);
// 下标访问数组元素

3. 类型转换

总结

字符串 to 其他:

let b: bool = a.parse().expect("Not bool");

其他 to 字符串:

let b: String = a.to_string();

其他 to 其他:

let b = a as i32;