Rust Overview

Table of Contents

1. Rust Overview

1.1. 风格

与 c 类似

struct MyPair {

}

enum MyEnum {

}

struct Pair {
    first_member: i32,
    second_member: i32,
}

fn hello_world (x i32) -> () {

}


fn main() {
    println!("{:?}", "hello");
}

1.2. 变量

  • let x:i32=10
  • let x=10
  • 全局变量: static x :i32=10 或 const x:i32=10
  • 使用 tuple 声明多个变量: let (mut x, mut y)=(1,2) let (mut x, mut y):(i32,i32)=(1,2)
  • 不支持 a,b = b,a

1.3. 函数

  • fn test(a:i32,b:i32) -> i32 {}
  • 不支持变长参数
  • lambda 表达式: |a,b| -> bool {}
  • lambda 不支持递归定义…

1.4. 输入输出

  • std::io::stdin().read_line
  • String::parse()
  • String::split()
  • println!
  • format!

1.5. 类型及转换

1.5.1. 基本类型

  • i8, u8, i32, u32, i64, u64, isize, usize
  • f32, f64
  • bool
  • char: 'a','b','我'…, 代表一个 unicode 字符
  • array: let x: [i32;10]=[1,2,3,4]
  • array slice: &[i32]
  • string slice: &str
  • 没有 byte

1.5.2. 复杂类型

  • Char, String, HashMap, HashSet, Vec
  • Option, Result
  • tuple: (), let x=(1,2,3), x.0==1, x.1==2, x.2==3
  • unwrap, unwrap_or
  • Box<T>
  • Rc
  • Arc

1.5.3. 转换

  • x as i8
  • 10 as i8

1.6. 分配与释放

  • 数组, 简单的结构体分配在栈上
  • 复杂类型通过 ::new() 分配, 一般分配在堆上
  • 不需要手动释放

1.7. string

  • String
  • &str
  • String::as_str
  • &str::to_string()
  • String::parse()
  • String 不支持 index, 需要通过 chars() 得到 char 的 iterator
  • concat
    • "hello".to_string() + "world"
    • push(char), push_str("str")
    • format!()
  • String::chars()
  • String::bytes()
  • String::split() Vec<String>::join()
  • string 转换为数字: "123".parse()
  • 数字转换为 string: fmt!("{:o}",123), 或者 :b, :x

1.8. iterator

  • into_iter() 与 iter()
  • String::chars()
  • collect
  • filter(&x)
  • fold, map, sum
  • max, max_by, max_by_key
  • zip, chain, cycle, repeat
  • all, any
  • rev, step_by
  • find
  • skip, take, nth, last
  • for_each
  • cloned

1.9. array, slice 与 Vec

  • vec!
  • Vec 通过 as_slice 转换为 slice
  • slice.to_vec 转换为 Vec
  • &a[1..4], &a[..], &a[1..], &a[..4]
  • vec 支持 v[index], 但无法把 v[index] move 出去, 一般通过 &v[index] 得到一个引用, 除非 vec 包含的类支持 copy
  • 支持 Vec::get(), Vec::set()
  • Vec::retain(|x| x>0)
  • push, pop, insert
  • get, swap
  • extend
    • let concated=[&first, &second[..]].concat()
    • first.extend(second.iter().cloned())
  • vec![vec![0;M];N] 二维

1.10. enum & match

  • match x {None => (), Some(b) => (), _ => ()}
  • enum Test {A,B,C}
  • enum Test {A(i32),B(f32),C{x:i32,y:i32},D(i32,i32,i32)}
  • let x=Test::A(10);

1.11. 控制结构

  • for i in (1..10)
  • while
  • loop
  • 'label

    fn main() {
        let mut x = 1;
        'label: loop {
            if x > 5 {
                break 'label;
            }
            x += 1;
        }
    }
    

1.12. 抽象数据类型

  • struct xxx {x:i32,y:i32}
  • struct yyy (i32,i32)
  • x=xxx{x:1,y:2}
  • y=yyy(1,2)
  • impl xxx {}
  • impl TraitX for xxx {}
  • trait
    • trait TraitX {fn test() -> i32;}
    • Debug, Display, Copy, Clone
    • PartialEq, Eq, PartialOrd, Ord
    • Hash
    • Iterator
    • From, To
    • Drop
    • Deref

1.13. HashMap

  • HashMap::new()
  • get(), insert()
  • map[&i]
  • contains_key()
  • keys(), values()
  • for (k,v) in map {}
  • *m.entry(key).or_insert(0) += 10
  • retain
  • key type
    • bool, int, string
    • 实现了 Eq 和 Hash traint 的类型, 一般的 struct 无法直接作为 key, 需要 derive PartialEq, Eq 和 Hash

1.14. 排序

  • Vec::sort
  • Vec::sort_by (|a,b| a.cmp(b))
  • Vec::sort_by_key (|x| -x.key_one)

1.15. 最大堆

1.16. math

1.17. random

1.18. package

  • use std::collections::HashMap
  • use util::*

1.19.

  • let x=[vec![];10] 失败, 要求 vec![] 是 Copy
  • change_vec(&mut v, v.len()) 失败, v 无法 borrow.

1.20. misc

1.20.1. unsafe

  • let px = &x as *const i32
  • let x = &mut x as *mut i32
  • unsafe {*x=10}

Author: [email protected]
Date: 2018-10-13 Sat 00:00
Last updated: 2022-02-06 Sun 21:58

知识共享许可协议