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}