• Rust 最常用函数


    配置 vscode 调试

    配置参考。下载 CodeLLDB,选择 rust 自动生成 launch.json 文件

    1. {
    2. "configurations": [
    3. // 添加一下行,使 vec/hashmap 等类型显示正常
    4. "sourceLanguages": ["rust"]
    5. ]
    6. }

    将编译文件与标准库的位置进行映射

    1. {
    2. "lldb.launch.sourceMap": {
    3. // 你自己的映射 hash 和映射路径
    4. "/rustc/4b91a6ea7258a947e59c6522cd5898e7c0a6a88f": "/Users/feiwu/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust"
    5. }
    6. }

    Hello_World.rs

    1. fn main() {
    2. println!("Hello, World!");
    3. }

    编译运行

    1. $ rustc Hello_World.rs
    2. $ ./Hello_World
    3. Hello, World!

    原始类型

    bool

    布尔值 (true / false)

    char

    字符

    f32, f64

    32 位、64 位浮点数

    i64, i32, i16, i8

    有符号 16- ... 整数

    u64, u32, u16, u8

    无符号 16 位,... 整数

    isize

    指针大小的有符号整数

    usize

    指针大小的无符号整数

    查看: Rust 类型

    格式化

    1. // 单个占位符
    2. println!("{}", 1);
    3. // 多个占位符
    4. println!("{} {}", 1, 3);
    5. // 位置参数
    6. println!("{0} 是 {1} {2},{0} 也是 {3} 编程语言", "Rust", "cool", "language", "safe");
    7. // 命名参数
    8. println!("{country} 是一个团结的国家", country = "China");
    9. // 占位符特征 :b 表示二进制, :0x 表示十六进制, :o 表示八进制
    10. println!("让我们打印 76 是二进制的 {:b} ,十六进制等价物是 {:0x} 八进制等价物是 {:o}", 76, 76, 76);
    11. // 调试特征
    12. println!("使用调试特征 {:?} 在此处打印我们想要的任何内容", (76, 'A', 90));
    13. // 1.58 中的新格式字符串
    14. let x = "world";
    15. println!("Hello {x}!");

    打印风格

    1. // 打印输出
    2. print!("Hello World\n");
    3. // 打印后追加新行
    4. println!("追加新行");
    5. // 打印为错误
    6. eprint!("这是一个错误\n");
    7. // 打印为新行错误
    8. eprintln!("这是新行的错误");

    变量

    1. // 初始化和声明变量
    2. let some_variable = "This_is_a_variable";
    3. // 使变量可变
    4. let mut mutable_variable = "Mutable";
    5. // 分配多个变量
    6. let (name, age) = ("ElementalX", 20);
    7. // (全局)常量
    8. const SCREAMING_SNAKE_CASE:i64 = 9;

    注释

    1. // 行注释
    2. /*.............块注释 */
    3. /// 外部文档注释
    4. //! 内部文档评论

    另见: 注释 (doc.rust-lang.org)

    函数

    1. fn test(){
    2. println!("这是一个函数!");
    3. }
    4. fn main(){
    5. test();
    6. }

    查看: Functions

    声明宏

    1. macro_rules! foo {
    2. ($l:tt) => { bar!($l); }
    3. }
    4. macro_rules! bar {
    5. (3) => {}
    6. }
    7. foo!(3);

    元变量

    item

    程序项

    block

    块表达式

    stmt

    语句
    (注意此选择器不匹配句尾的分号)

    pat

    模式

    expr

    表达式

    ty

    类型

    ident

    标识符或关键字

    path

    类型表达式 形式的路径

    tt

    token 树
    (单个 token 或宏匹配定界符 ()、[] 或 {} 中的标记)

    meta

    属性,属性中的内容

    lifetime

    生存期 token

    vis

    可能为空的可见性限定符

    literal

    匹配 -? 字面量表达式

    结构体

    结构体是一个使用关键字 struct 定义的标称型(nominal)结构体类型

    1. struct Point { x: i32, y: i32 }
    2. let p = Point { x: 10, y: 11 };
    3. let px: i32 = p.x;

    元祖结构体

    1. struct Color (i32, i32, i32);
    2. let black = Color(0,0,0);

    单元结构体

    不关心该类型的内容, 只关心它的行为。

    1. struct Solution;
    2. impl Solution{
    3. // ...
    4. }

    语句与表达式

    在 rust 中,语句无需返回值,而表达式总要返回值

    语句

    1. let a = "hello".to_string();
    2. let b = a + " world";
    3. println!("{}", b);

    表达式

    1. fn main(){
    2. let x = {
    3. let a = "hello".to_string();
    4. a + " world"
    5. };
    6. println!("{}", x);
    7. // hello world
    8. }

    Rust 类型

    类型别名

    1. type Point = (u8, u8);
    2. let p: Point = (41, 68);

    整数

    1. let mut a: u32 = 8;
    2. let b = 877_u64;
    3. let c = 8999i64;
    4. let d = -90;

    浮点数

    1. let mut sixty_bit_float: f64 = 89.90;
    2. let thirty_two_bit_float: f32 = 7.90;
    3. let just_a_float = 69.69;

    布尔值

    1. let true_val: bool = true;
    2. let false_val: bool = false;
    3. let just_a_bool = true;
    4. let is_true = 8 < 5; // => false

    字符

    1. let first_letter_of_alphabet = 'a';
    2. let explicit_char: char = 'F';
    3. let implicit_char = '8';
    4. let emoji = "\u{1f600}"; // =>

    字符串字面量

    1. let community_name = "AXIAL";
    2. let no_of_members: &str = "ten";
    3. println!("社区的名称是 {community_name},它有 {no_of_members} 个成员");

    查看: 字符串

    数组

    这里介绍的是固定长度的数组。rust 中常用的是集合类型 vec 表示的动态数组

    1. ┌─────┬─────┬─────┬─────┬─────┬─────┐
    2. | 92 | 97 | 98 | 99 | 98 | 94 |
    3. └─────┴─────┴─────┴─────┴─────┴─────┘
    4. 0 1 2 3 4 5

    let array: [i64; 6] = [92,97,98,99,98,94];
    

    1. let mut array: [i32 ; 3] = [2,6,10];
    2. array[1] = 4;
    3. array[2] = 6;

    使用 mut 关键字使其可变

    切片

    1. let mut array: [ i64; 4] = [1,2,3,4];
    2. // 下限包括在内,上限不包括在内
    3. let mut slices: &[i64] = &array[0..3]
    4. println!("切片的元素是:{slices:?}");

    元组

    let tuple = (1, 'A' , "Cool", 78, true);
    

    Rust 字符串

    字符串字面量

    1. let cs:&str = "备忘清单";
    2. // => 为开发者分享备忘单
    3. println!("为开发者分享 {cs}");

    字符串对象

    1. // 创建一个空字符串对象
    2. let my_string = String::new;
    3. // 转换为字符串对象
    4. let S_string = a_string.to_string()
    5. // 创建一个初始化的字符串对象
    6. let lang = String::from("Rust");
    7. println!("First language is {lang}");

    .capacity()

    1. let rand = String::from("Random String");
    2. rand.capacity() // => 13

    以字节为单位计算字符串的容量

    .contains()

    1. let name = String::from("ElementalX");
    2. name.contains("Element") // => true

    检查子字符串是否包含在原始字符串中

    添加单个字符

    1. let mut half_text = String::from("Hal");
    2. half_text.push('f'); // => Half

    添加整个字符串

    1. let mut hi = String::from("Hey there...");
    2. hi.push_str("How are you doing??");
    3. // => Hey there...How are you doing??
    4. println!("{hi}");

    原生字符串

    1. let str1 = r#"\hello"#;
    2. println!("{}", str1);
    3. // \hello

    原生字符串,无需增加转义字符(\)转义

    字节和字节串

    1. let str2 = b'a';
    2. println!("{}", str2);
    3. // 97
    4. let str3 = b"\\hello";
    5. println!("{:?}", str3);
    6. // [92, 104, 101, 108, 108, 111]
    7. let str4 = br#"\hello"#;
    8. println!("{:?}", str4);
    9. // [92, 104, 101, 108, 108, 111]

    Rust 动态数组

    创建动态数组

    1. let v: Vec<i32> = Vec::new();
    2. // 使用宏
    3. let v1 = vec![1, 2, 3];

    读取元素

    1. let v = vec![1, 2, 3, 4, 5];
    2. let element = &v[100];
    3. // panic,越界
    4. let element2 = v.get(100);
    5. println!("{:?}", element2);
    6. //None

    遍历数组

    1. 只读取数组中的元素
    2. let v = vec![1, 2, 3]; for i in &v { println!("{}", i); }
    3. 遍历的同时修改数组中的元素
    4. let mut v = vec![1, 2, 3]; for i in &mut v { *i += 10 }

    多维数组

    1. j0 j1 j2 j3 j4 j5
    2. ┌────┬────┬────┬────┬────┬────┐
    3. i0 | 1 | 2 | 3 | 4 | 5 | 6 |
    4. ├────┼────┼────┼────┼────┼────┤
    5. i1 | 6 | 5 | 4 | 3 | 2 | 1 |
    6. └────┴────┴────┴────┴────┴────┘

    1. let arr = vec![
    2. vec![1, 2, 3, 4, 5, 6],
    3. vec![6, 5, 4, 3, 2, 1]
    4. ];

    常用方法

    len()

    返回 vec 的长度

    is_empty()

    vec 是否为空

    push(value)

    在 vec 尾部插入元素

    pop()

    删除并返回 vec 尾部的元素或者返回 None

    insert(index,element)

    在指定索引处插入元素

    remove(index)

    删除指定索引处的元素并返回被删除的元素,索引越界将 panic 报错退出

    clear()

    清空 vec

    append(vec)

    将另一个 vec 中的所有元素追加移入 vec 中,移动的 vec 变为空

    truncate(len)

    将 vec 截断到指定长度,多余的元素被删除

    retain(f)

    根据给定的函数,保留满足条件的元素

    drain(range)

    删除 vec 中指定范围的元素,同时返回一个迭代该范围所有元素的迭代器

    split_off(index)

    切分 vec,索引左边的元素保留在原 vec 中(含索引),索引右边的元素(不含索引)在返回的 vec 中

    枚举

    在结构体中使用枚举

    1. enum IpAddrKind {
    2. V4,
    3. V6,
    4. }
    5. struct IpAddr {
    6. kind: IpAddrKind,
    7. address: String,
    8. }
    9. fn main(){
    10. let ip = IpAddr{
    11. kind: IpAddrKind::V4,
    12. address: String::from("127.0.0.1")
    13. };
    14. }

    枚举的变体

    1. enum IpAddrKind {
    2. V4(u8, u8, u8, u8),
    3. V6(String),
    4. }
    5. fn main() {
    6. let home = IpAddrKind::V4(127, 0, 0, 1);
    7. let loopback = IpAddrKind::V6(String::from("::1"));
    8. }

    1. enum Message{
    2. Quit,
    3. Move {x:i32, y:i32},
    4. Write(String),
    5. ChangeColor(i32, i32, i32),
    6. }
    7. fn main(){
    8. let q = Message::Quit;
    9. let m = Message::Move {x:10, y:20};
    10. let w = Message:: Write(String::from("hello"));
    11. let c = Message::ChangeColor(10, 20, 30);
    12. }

    模式匹配结构体

    1. #[derive(Debug)]
    2. enum Grade {
    3. A,
    4. B,
    5. C,
    6. }
    7. enum Subject {
    8. Math(Grade),
    9. English(Grade),
    10. }
    11. fn subject_grade(sub: Subject) {
    12. match sub {
    13. Subject::Math(grade) => println!("The Math is {:?}", grade),
    14. Subject::English(grade) => println!("The Math is {:?}", grade),
    15. }
    16. }
    17. fn main() {
    18. subject_grade(Subject::Math(Grade::A));
    19. }

    Rust 运算符

    比较运算符

    e == f

    e 等于 f

    e != f

    e 不等于 f

    e < f

    e 小于 f

    e > f

    e 大于 f

    e <= f

    e 小于或等于 f

    e >= f

    e 大于或等于 f


    1. let (e, f) = (1, 100);
    2. let greater = f > e; // => true
    3. let less = f < e; // => false
    4. let greater_equal = f >= e; // => true
    5. let less_equal = e <= f; // => true
    6. let equal_to = e == f; // => false
    7. let not_equal_to = e != f; // => true

    算术运算符

    a + b

    a 被添加到 b

    a - b

    从 a 中减去b

    a / b

    a 除以 b

    a % b

    通过与 b 相除得到 a 的余数

    a * b

    a 与 b 相乘


    1. let (a, b) = (4, 5);
    2. let sum: i32 = a + b; // => 9
    3. let subtractions: i32 = a - b; // => -1
    4. let multiplication: i32 = a * b; // => 20
    5. let division: i32 = a / b; // => 0
    6. let modulus: i32 = a % b; // => 4

    位运算符

    g & h

    二进制与

    g | h

    二进制或

    g ^ h

    二进制异或

    g ~ h

    二进制补码

    g << h

    二进制左移

    g >> h

    二进制右移


    1. let (g, h) = (0x1, 0x2);
    2. let bitwise_and = g & h; // => 0
    3. let bitwise_or = g | h; // => 3
    4. let bitwise_xor = g ^ h; // => 3
    5. let right_shift = g >> 2; // => 0
    6. let left_shift = h << 4; // => 32

    逻辑运算符

    c && d

    两者都是真的_(AND)_

    `c

    !c

    c 为假 (NOT)


    1. let (c, d) = (true, false);
    2. let and = c && d; // => false
    3. let or = c || d; // => true
    4. let not = !c; // => false

    复合赋值运算符

    1. let mut k = 9;
    2. let mut l = k;

    k += l

    添加一个值并赋值,然后 k=9

    k -= l

    Substrate 一个值并赋值,然后 k=18

    k /= l

    除以一个值并赋值,然后 k=9

    k *= l

    乘一个值并赋值,然后 k=81

    k |= l

    按位或并赋值,则 k=89

    Rust 流程控制

    If 表达式

    1. let foo = 12;
    2. let bar = 13;
    3. if foo == bar {
    4. println!("foo 等于 bar");
    5. } else if foo < bar {
    6. println!("foo 小于 bar");
    7. } else if foo != bar {
    8. println!("foo 不等于 bar");
    9. } else {
    10. println!("Nothing");
    11. }

    For 循环

    1. let mut vec = [1, 2, 3];
    2. for v in &mut vec {
    3. *v -= 1;
    4. println!("v 的值为:{v}");
    5. }

    for item in collection

    for item in collection.into_iter()

    转移所有权

    for item in &collection

    for item in collection.iter()

    不可变借用

    for item in &mut collection

    for item in collection.iter_mut()

    可变借用

    While 循环

    1. let mut check = 0;
    2. while check < 11{
    3. println!("check 是:{check}");
    4. check += 1;
    5. println!("递增后:{check}");
    6. if check == 10{
    7. break; // 停止 while
    8. }
    9. }

    Loop 循环

    1. loop {
    2. println!("你好,世界永远!");
    3. }

    无限循环表示

    Continue 继续声明

    1. for (v, c) in (0..10+1).enumerate(){
    2. println!("{c} 数字循环");
    3. if v == 9{
    4. println!("我们继续?");
    5. continue;
    6. }
    7. println!{"v 的值为:{v}"};
    8. }

    Break 中断语句

    break 可以单独使用,也可以带一个返回值

    1. let mut i = 1;
    2. let res = loop {
    3. println!("i 是 {i}");
    4. if i > 100 {
    5. break i - 100;
    6. }
    7. i *= 2;
    8. }
    9. println!("{res}"); // 28

    Rust 模式匹配

    match

    match 模式匹配,使用 a | b 表示匹配 a  b,使用 _,表示匹配剩余所有选项

    1. fn main(){
    2. let grade = Grade::A;
    3. match grade {
    4. Grade::A => println!("Good"),
    5. Grade::B => println!("Not bad"),
    6. Grade::C | Grade::D => println!("Come on"),
    7. _ => println!("emmm"),
    8. }
    9. }
    10. enum Grade {
    11. A,
    12. B,
    13. C,
    14. D,
    15. E,
    16. F,
    17. }

    matches!宏

    它可以将一个表达式跟模式进行匹配,然后返回匹配的结果 true 或 false

    1. assert!(matches!('x' ',A'..='Z' | 'a'..='z'));
    2. assert!(matches!(Some(101), Some(x) if x > 100));

    if let 匹配

    match 表达式需要匹配所有的枚举才能结束,但通常我们只需要匹配我们需要的值

    1. let x = 3;
    2. match Some(x) {
    3. Some(3) => println!("I guess that x is 3"),
    4. _ => ()
    5. }

    使用 if let

    1. let x = 3;
    2. if let Some(3) = Some(x) {
    3. println!("I guess that x is 3");
    4. }

    while let

    1. let mut stack = vec![];
    2. stack.push(1);
    3. stack.push(2);
    4. stack.push(3);
    5. while let Some(top) = stack.pop() {
    6. println!("{}", top);
    7. }

    其它模式匹配

    for 循环迭代器

    1. for (i, v) in collection.iter().enumerate(){}

    let

    1. let (x, _, y) = (1, 2, 3);
    2. println!("{x},{y}");

    函数中的模式匹配

    1. fn add((x, y): (i32, i32)) -> i32 {
    2. x + y
    3. }
    4. fn main(){
    5. let sum = add(1, 2);
    6. println!("{sum}");
    7. }

    忽略参数

    使用..忽略剩余参数

    1. struct Point {
    2. x: i32,
    3. y: i32,
    4. z: i32,
    5. }
    6. let origin = Point { x: 0, y: 0, z: 0 };
    7. match origin {
    8. Point { x, .. } => println!("x is {}", x),
    9. }

    使用_忽略部分参数

    1. let hello = ('h', 'e', 'l', 'l', 'o');
    2. match hello {
    3. (h, _, _, l, o) => {
    4. println!("char: {}, {}, {}", h, l, o)
    5. },
    6. }

    匹配命名变量

    以下代码,只要给定的 x 是 Some 类型,但 Some 中的值不是 1,都会匹配到 y

    1. let x = Some(10);
    2. match x {
    3. Some(1) => println!("x = 1"),
    4. Some(y) => println!("y = {:?}", y),
    5. _ => println!("None"),
    6. }// y = 10

    @绑定

    @ 运算符允许为一个字段绑定另外一个变量。

    1. let grade = 'A';
    2. match grade {
    3. good @ 'A'..='C' => println!("your grade is {}", good),
    4. _ => println!("Come on"),
    5. }

    1. #[derive(Debug)]
    2. struct Point {
    3. x: i32,
    4. y: i32,
    5. }
    6. fn main(){
    7. let p @ Point {x: px, y: py } = Point {x: 10, y: 23};
    8. println!("x: {}, y: {}", px, py);
    9. println!("{:?}", p);
    10. }

    如果使用 |,需要使用 (),进行多个模式的绑定

    1. match 1 {
    2. num @ (1 | 2) => {
    3. println!("{}", num);
    4. }
    5. _ => {}
    6. }

    使用匹配守卫

    1. let x = Some(2);
    2. match x {
    3. Some(1) => println!("x = 1"),
    4. Some(y) if y == 2 => println!("y = {:?}", y),
    5. _ => println!("No match"),
    6. }// y = 2

    Rust 函数

    函数命名

    rust 的函数使用蛇形命名法(snake case)

    1. fn print_message(){
    2. println!("Hello, Quick Reference!");
    3. }

    参数值

    rust 需要为函数的参数标明确定的类型

    1. fn another_fn(a:u8, b: &str){
    2. println!("我是 u8:{}", a);
    3. println!("我是 &str:{}", b);
    4. }
    5. fn main(){
    6. another_fn(10, "hello")
    7. }

    返回值

    如果不指定返回值,rust 默认返回 () 类型

    1. // 在 bin 中的入口函数默认返回 ()
    2. fn main(){}

    使用 -> 指定返回值,如果表达式在最后一行,无需使用 return

    1. fn add(a:i32, b:i32) -> i32 {
    2. if a + b < 100 {
    3. return a - b;
    4. }
    5. a + b
    6. }

    永不返回!

    1. fn dead_end() -> ! {
    2. panic!("panic!!!!!");
    3. }

    惯用转换

    &str -> String

    1. String::from("str");
    2. "str".to_string();
    3. "str".to_owned();

    &str -> &[u8]

    "str".as_bytes();
    

    或者你也可以使用 b""

    println!("{:?}", b"str");
    

    &str -> Vec

    1. "str".as_bytes().to_vec();
    2. "str".as_bytes().to_owned();

    String -> &str

    1. let s = String::from("str");
    2. let r = s.as_str();

    String -> &[u8]

    1. let s = String::from("str");
    2. let v = s.as_bytes();

    String -> Vec

    1. let s = String::from("str");
    2. let v = s.into_bytes();

    &[u8] -> &str

    1. let b = "str".as_bytes();
    2. let str = std::str::from_utf8(b).unwrap();

    &[u8] -> String

    1. let b = "str".as_bytes();
    2. let str = String::from_utf8(b.to_vec()).unwrap();

    &[u8] -> Vec

    1. let b = "str".as_bytes();
    2. let str = b.to_vec();

    1. let b = "str".as_bytes();
    2. let str = b.to_owned();

    Vec-> &str

    1. let b = "str".as_bytes().to_vec();
    2. let s = std::str::from_utf8(&b).unwrap();

    Vec-> &[u8]

    1. let b = "str".as_bytes().to_vec();
    2. let s = b.as_slice();

    Vec-> String

    1. let b = "str".as_bytes().to_vec();
    2. let s = String::from_utf8(b).unwrap();

    杂项

    类型断言 type-casting

    1. let a_int = 90; // int
    2. // int 到 float
    3. let mut type_cast = (a_int as f64);

    1. let orginal: char = 'I';
    2. // char 到 int => 73
    3. let type_casted: i64 = orginal as i64;

    要在 Rust 中执行类型转换,必须使用 as 关键字

    借用

    1. let mut foo = 4;
    2. let mut borrowed_foo = &foo;
    3. println!("{borrowed_foo}");

    1. let mut bar = 3;
    2. let mut mutable_borrowed_bar = &mut bar;
    3. println!("{mutable_borrowed_bar}");

    这里借用的值使用 & 运算符从值一中借用值

    解引用

    1. let mut borrow = 10;
    2. let deref = &mut borrow;
    3. println!("{}", *deref);

    * 操作符用于解引用

    作用域

    1. {
    2. // 范围仅限于此大括号
    3. let a_number = 1;
    4. }
    5. println!("{a_number}");
  • 相关阅读:
    基于Python的“书怡”在线书店系统的设计与实现毕业设计源码082332
    解决vscode项目中无法识别宏定义的问题
    枚举的应用
    无人机运营合格证及无人机服务资质认证详解
    理解中国经济的五层思维-中国视角下的宏观经济
    实践讲解Spring配置中心config(图+文,本地文件方式)
    JVM主要组成部分及其作用
    requirements.txt文件如何生成及导入
    Vue+element开发Simple Admin后端管理系统页面
    【动态规划】45. 跳跃游戏 II
  • 原文地址:https://blog.csdn.net/huang714/article/details/128081973