Rust lifetime 101

定义 在 Rust 中,生命周期(lifetime)是用来描述引用(reference)有效期的一种概念。每个引用都有一个生命周期,表示该引用指向的数据在内存中的存活时间。生命周期用于在编译时检查引用是否有效,并避免出现空指针、野指针等内存安全问题。 ...

December 8, 2022

rust type cheat sheet

Option 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 // To inner type unwrap () -> T unwrap_or (T) -> T unwrap_or_else (() -> T) -> T unwrap_or_default () -> T where T: Default expect (&str) -> T //Converting to another type map ((T) -> U) -> Option<U> map_or (U, (T) -> U) -> U map_or_else (() -> U, (T) -> U) -> U // To Result ok_or (E) -> Result<T, E> ok_or_else (() -> E) -> Result<T, E> //Conditioning filter ((&T) -> bool) -> Option<T> and (Option<U>) -> Option<U> and_then ((T) -> Option<U>) -> Option<U> or (Option<T>) -> Option<T> or_else (() -> Option<T>) -> Option<T> xor (Option<T>) -> Option<T> Option<&T> 1 2 3 // Cloning inner cloned () -> Option<T> where T: Clone copied () -> Option<T> where T: Copy Option< Option > 1 flatten () -> Option<T> Option< Result<T, E> > 1 transpose () -> Result<Option<T>, E> &Option 1 2 3 4 5 6 7 8 // Checking inner is_some () -> bool is_none () -> bool //To inner reference as_ref () -> Option<&T> iter () -> Iterator<&T> as_deref () -> Option<&U> where T: Deref<Target = U>

December 8, 2021

typeof for Rust

typeof for C c语言的typeof的应用: 1 2 3 #define SWAP(a, b) do { \ typeof(a) tmp = a; b = a; a = tmp; \ } while(0) 1 2 3 4 5 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) typeof for rust 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 use std::any::type_name; fn type_of<T>(_: T) -> &'static str { type_name::<T>() } fn main() { let x = 21; let y = 2.5; println!("{}", type_of(&y)); println!("{}", type_of(x)); println!("{}", type_of("abc")); println!("{}", type_of(String::from("abc"))); println!("{}", type_of(vec![1, 2, 3])); println!("{}", type_of(main)); println!("{}", type_of(&type_of::<i32>)); }

December 8, 2021

tips for learning rust

资料 The Rust Programming Language Rust Language Cheat Sheet Zero to Production in Rust This Week in Rust awesome-rust awesome-cli-rust tools and libaries cargo-asm A cargo subcommand that displays the generated assembly of Rust source code. cargo-fuzz A cargo subcommand for fuzzing with libFuzzer hyperfine A command-line benchmarking tool flamegraph sqlx yarte opentelemetry thiserror rust-clippy Serde Tokio Rocketi Rocket Diesel Rayon Actix Hyper Anyhow Thiserror PyO3 Rkyv 心法 保持耐心,不要心急,毕竟rust学习曲线陡峭 编译器是最好的老师,同时记住编译器永远是正确的 克服传统语言的思维定势,建立新思维模型如资源与变量分离,同时尝试整合范型编程,类型编程,函数式编程,异步编程,meta-programming 从简单开始,从基础开始 深入从rust内存管理原理开始,扩展到多线程与异步环境 学以致用,可以用rust做一些个人的项目

September 8, 2021

writing a tree in rust

define the tree structure 1 2 3 4 5 6 #[derive(PartialEq)] struct TreeNode<T> { pub value: Option<T>, pub children: Vec<Rc<RefCell<TreeNode<T>>>>, pub parent: Option<Rc<RefCell<TreeNode<T>>>>, } new tree 1 2 3 4 5 6 7 pub fn new() -> TreeNode<T> { TreeNode { value: None, children: vec![], parent: None, } } add_child 1 2 3 pub fn add_child(&mut self, new_node: Rc<RefCell<TreeNode<T>>>) { self.children.push(new_node); } del_child 1 2 3 4 pub fn del_child(&mut self, node_to_remove: Rc<RefCell<TreeNode<T>>>) { self.children .retain(|child| !Rc::ptr_eq(child, &node_to_remove)); } print 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 pub fn print(&self) -> String where T: ToString, { if let Some(ref value) = self.value { value.to_string() } else { String::from("[") + &self .children .iter() .map(|tn| tn.borrow().print()) .collect::<Vec<String>>() .join(",") + "]" } } code The code as follows: ...

September 7, 2021

Rust Vec 101

vector in Rust 1 2 3 4 5 struct Vec { length: u32, //Present size of vector ptr: RefCell, //Pointer to allocate Memory on Heap capacity: u32, //Max size vector can hold, after this vector need to be resized/reallocated } create 不指定数据类型 1 2 let mut v1 = Vec::new(); let mut v2 = vec![]; 指定数据类型 1 2 3 let mut v1:Vec<i32> = Vec::new(); let mut v2:Vec<i32> = vec![]; let mut v3 = vec![1i32, 2,3]; 创建并初始化 1 2 3 4 5 6 let mut v1 = vec![1,2,3]; let mut v2:Vec<i32> = vec![1,2,3]; let mut v3 = vec![1i32,2,3]; let mut v4 = vec![1; 10]; let mut v5: Vec<i32> = (0..10).collect(); let v6: Vec <i32> = [1,2,3].to_vec(); 2D vector 1 2 3 let mut 2d_vec: Vec<Vec<i32>> = Vec::new(); let mut 2d_vec: Vec<Vec<i32>> = vec![vec![0; row as usize]; col as usize]; convert from slic 1 2 3 4 5 fn main() { let a = &[1,2,3]; let v1 = a.to_vec(); println!("{:?}", v1) } 1 2 3 4 5 fn main() { let a = &[1,2,3]; let v1 = Vec::from(a); println!("{:?}", v1) } 1 2 3 4 5 6 fn main() { let mut v1 = Vec::new(); let a = &[1,2,3]; v1.extend_from_slice(a); println!("{:?}", v1) } 访问元素 read 1 2 3 4 let mut v1 = vec![1,2,3]; let item = v1[0]; println!("{:?},{:?}", v1.get(0),v1.get(100)); //Some(1),None slice 1 2 3 let v1 = vec![1,2,3,4,5]; let v2 = v1[1..]; let v2 = v1[1..3]; write 1 2 let mut v1 = vec![1,2,3]; v1[0] = 11; insert 1 2 3 4 5 6 fn main() { let mut v1 = vec![1,2,3]; v1.insert(2,1); println!("v1:{:?}",v1); } // v1:[1, 2, 1, 3] remove 1 2 3 4 let mut v1 = vec![1,2,3]; v1.remove(0); println!("v1:{:?}",v1); // v1:[2, 3] clear 1 2 3 4 5 6 7 fn main() { let mut weapons = vec!["Andúril", "Sting", "Glamdring"]; weapons.clear(); println!("Weapons after the war: {:?}", weapons); } append 1 2 3 4 5 6 7 fn main() { let mut v1 = vec![1,2,3]; let mut v2 = vec![4,5,6]; v1.append(&mut v2); println!("v1:{:?}",v1); } // v1:[1, 2, 3, 4, 5, 6] extend 1 2 3 4 5 6 let mut vec1 = vec![1, 2, 3]; let vec2 = vec![4, 5, 6]; vec1.extend(vec2); assert_eq!(vec1, [1, 2, 3, 4, 5, 6]); 1 2 3 4 5 6 7 let vec1 = vec![1, 2, 3]; let vec2 = vec![4, 5, 6]; let mut vec3 = vec1; vec3.extend(vec2.into_iter()); assert_eq!(vec3, [1, 2, 3, 4, 5, 6]); 1 2 3 4 5 6 7 8 9 fn main() { let mut army_of_men = vec!["Aragorn"]; let elves_and_dwarves = vec!["Legolas", "Gimli"]; // The Elves and Dwarves join the coalition army_of_men.extend(elves_and_dwarves); println!("United Army: {:?}", army_of_men); } sort 1 2 3 4 5 6 7 8 9 10 11 12 fn main() { let mut v1 = vec![1,2,3, 3,2,1]; v1.sort(); println!("v1:{:?}",v1); let result = v1.binary_search(&2); println!("result:{:?}",result); } // v1:[1, 1, 2, 2, 3, 3] // result:Ok(3) resize 1 2 3 4 5 6 7 8 9 fn main() { let mut v1 = vec![1,2,3, 3,2,1]; v1.resize(10, 0); println!("v1:{:?}",v1); v1.resize(2, 0); println!("v1:{:?}",v1); } // v1:[1, 2, 3, 3, 2, 1, 0, 0, 0, 0] // v1:[1, 2] push and pop 1 2 3 4 let mut v1 = vec![1,2,3]; v1.push(4); v1.push(5); let item = v1.pop(); iterator 1 2 3 4 5 6 7 8 9 10 11 12 13 let mut v = vec![1,2,3]; for item in &v { } for item in &mut v { } for item in v { } 1 2 3 4 5 6 7 8 9 10 11 12 13 let mut v = vec![1,2,3]; for (i, x) in v.iter().enumerate() { println!("In position {} we have value {}", i, x); } for x in v.iter() { println!("item:{}",x); } for x in v.iter_mut() { *x *= 3; } println!("Updated vector: {:?}", xs); 1 2 3 let items = vec![1, 2, 3]; let sitems = items.into_iter().map(|x| x.to_string()).collect::<Vec<_>>(); println!("sitem: {:?}",sitems); concat() 1 2 3 4 5 6 7 8 9 fn main() { let elves = vec!["Legolas", "Thranduil"]; let dwarves = vec!["Gimli", "Thorin"]; // Uniting Elves and Dwarves let united_army = [elves, dwarves].concat(); println!("United army: {:?}", united_army); } 属性 capacity 1 2 let mut v1 = vec![1,2,3]; println!("capacity={}",v1.capacity()); len 1 2 let mut v1 = vec![1,2,3]; println!("len={}",v1.len()); is_empty 1 2 let mut v1 = vec![1,2,3]; println!("is_empty={}",v1.is_empty()); contains 1 2 3 4 5 6 7 8 9 fn main() { let mut v1 = vec![1,2,3]; println!("{} is in v1:{:?}",1, v1.contains(&1)); println!("{} is in v1:{:?}",11, v1.contains(&11)); } // 1 is in v1:true // 11 is in v1:false application storing enum in vector 1 2 3 4 5 6 7 8 9 10 11 12 13 14 use std::{string::String, u32}; #[derive(Debug)] enum Address{ NoIP, IPv4(u8,u8,u8,u8), IPv6(String), } fn main() { let mut v:Vec<Address> = Vec::new(); v.push(Address::NoIP); v.push(Address::IPv4(1,2,3,4)); println!("{:#?}",v[1]); } into_iter().enumerate() 1 2 3 4 5 6 7 fn main() { let v = vec![3,2,4]; for (idx, num) in v.into_iter().enumerate() { println!("index={}, value={}", idx, num); } }

September 8, 2019

Rust crate加速

由于墙的原因,导致cargo build,cargo run都会出现概率性失败,并且整个过程十分缓慢。 下面是解决方案: 方案1 在 ~/.cargo/config文件(如果没有创建一个)下添加如下内容: ...

August 11, 2019