main.rs
mod closure;
mod collection;
mod common;
mod config;
mod const_var;
mod expression;
mod function;
mod genericity;
mod if_and_loop;
mod iterator;
mod lifetime;
mod memory;
mod option_result;
mod ownership;
mod pattern_mode;
mod process;
mod remark;
mod smart_pointer;
mod the_enum;
mod thread_usecase;
mod types;
mod unit_test;
mod unsafe_rust;
mod use_string;
mod use_struct;
mod use_trait;
fn main() {
()
}
closure.rs
use super::common::*;
#[test]
fn use_closure_case1() {
let func1 = |num| println!("hello! {}", num);
func1(10);
}
#[test]
fn use_closure_style() {
fn add_one_v1(x: u32) -> u32 {
println!("result is param + 1");
x + 1
}
let add_one_v2 = |x: u32| -> u32 {
println!("result is param + 1");
x + 1
};
let add_one_v3 = |x| {
println!("result is param + 1");
x + 1
};
let add_one_v4 = |x| x + 1;
assert_eq!(add_one_v1(1), 2);
assert_eq!(add_one_v2(1), 2);
assert_eq!(add_one_v3(1), 2);
assert_eq!(add_one_v4(1), 2);
}
#[test]
fn use_closure_case2() {
let func1 = |num| {
println!("hello! {}", num);
num
};
let _result = func1(10);
assert_eq!(get_var_type(_result), "i32");
assert_eq!(
get_var_type(func1),
"hello_rust::closure::use_closure_case2::{
{closure}}"
);
let func2 = |param| {
println!("hello! {}", param);
param
};
let _result = func2(10.0);
assert_eq!(get_var_type(_result), "f64");
assert_eq!(
get_var_type(func2),
"hello_rust::closure::use_closure_case2::{
{closure}}"
);
assert_eq!(
get_var_type(&func2),
"&hello_rust::closure::use_closure_case2::{
{closure}}"
);
}
#[test]
fn use_closure_case3() {
let x = 0;
let func1 = |num| num;
let y = 0;
let funcx = func1;
let z = 0;
assert_eq!(func1(10), 10);
assert_eq!(funcx(10), 10);
println!("{:p} ", &x);
println!("{:p}", &func1);
println!("{:p} ", &y);
println!("{:p}", &funcx);
println!("{:p} ", &z);
}
#[test]
fn use_closure_case4() {
let x = 0;
let func1 = |num| num;
let func2 = |num| num;
let func3 = |num1, num2| num1 + num2;
let y = 0;
assert_eq!(func1(10), 10);
assert_eq!(func2(10.0), 10.0);
assert_eq!(func3(10, 10), 20);
println!("{:p} ", &x);
println!("{:p}", &func1);
println!("{:p}", &func2);
println!("{:p}", &func3);
println!("{:p} ", &y);
}
#[test]
fn use_generic_closure1() {
struct _Cacher<T>
where
T: Fn(u32) -> u32,
{
_calculation: T,
_value: Option<u32>,
}
impl<T> _Cacher<T>
where
T: Fn(u32) -> u32,
{
fn _get_value(&mut self, x: u32) -> u32 {
if let Some(result) = self._value {
return result;
}
let result = (self._calculation)(x);
self._value = Some(result);
result
}
}
let mut _cacher1 = _Cacher {
_calculation: |num| num + 1,
_value: None,
};
assert_eq!(
get_var_type(&_cacher1),
"&hello_rust::closure::use_generic_closure1::_Cacher"
);
assert_eq!(_cacher1._get_value(10), 11);
assert_eq!(_cacher1._get_value(1), 11);
assert_eq!(_cacher1._get_value(2), 11);
assert_eq!(_cacher1._get_value(1000), 11);
}
#[test]
fn use_closure_get_env_var1() {
let x: i32 = 88;
let closure1 = |param: i32| -> bool {
println!("i can use x");
x == param
};
assert_eq!(closure1(88), true);
assert_eq!(closure1(87), false);
}
#[test]
fn use_closure_get_env_var2() {
struct _Point {
_x: i32,
_y: i32,
};
let param1 = _Point {
_x: 0, _y: 1 };
let closure_fn_once = move || {
println!("{}-{}", param1._x, param1._y);
};
closure_fn_once();
closure_fn_once();
let mut param2 = _Point {
_x: 0, _y: 1 };
let mut closure_fn_mut = || {
param2._x += 1;
param2._x
};
assert_eq!(closure_fn_mut(), 1);
assert_eq!(closure_fn_mut(), 2);
assert_eq!(closure_fn_mut(), 3);
assert_eq!(closure_fn_mut(), 4);
assert_eq!(closure_fn_mut(), 5);
println!("{}-{}", param2._x, param2._y);
}
#[test]
fn return_closure() {
fn _returns_closure() -> Box<dyn Fn(i32) -> i32> {
Box::new(|x| x + 1)
}
}
collection.rs
use super::common::*;
#[test]
fn i32_slice_usecase() {
let arr = [1, 2, 3, 4, 5];
let slice = &arr[1..3];
assert_eq!(get_var_type(slice), "&[i32]");
assert_eq!(slice[0], arr[1]);
assert_eq!(slice[1], arr[2]);
let mut arr = [1, 2, 3, 4, 5];
let slice = &mut arr[1..3];
println!("{}", slice[0]);
}
#[test]
fn use_vec_base1() {
let mut vec1: Vec<i32> = Vec::new();
vec1.push(1);
vec1.push(2);
vec1.push(3);
vec1.push(4);
let out_val = vec1.pop();
assert_eq!(out_val, Some(4));
assert_eq!(get_var_type(out_val), "core::option::Option");
assert_eq!(vec1[0], 1);
assert_eq!(&vec1[0], &1);
assert_eq!(get_var_type(&vec1[0]), "&i32");
assert_eq!(vec1.get(0), Some(&1));
assert_eq!(get_var_type(vec1.get(0)), "core::option::Option<&i32>");
assert_eq!(vec1.get(100), None);
let vec2 = vec![1, 2, 3];
assert_eq!(vec1, vec2);
assert_eq!(vec1.pop(), Some(3));
assert_eq!(vec1.pop(), Some(2));
assert_eq!(vec1.pop(), Some(1));
assert_eq!(vec1.pop(), None);
assert_eq!(vec1.pop(), None);
assert_eq!(vec1.len(), 0);
assert_eq!(vec1.capacity(), 4);
let mut vec3 = vec![String::from("zhang xiao san"), String::from("li si")];
let _my_name = &mut vec3[0];
*_my_name = String::from("zhang xiao er");
let _my_name2 = &vec3[0];
assert_eq!(get_var_type(_my_name2), "&alloc::string::String");
assert_eq!(vec3.len(), 2);
assert_eq!(vec3.capacity(), 2);
println!("{:?}", vec3);
}
#[test]
fn use_vec_base2() {
let v = vec![1, 2, 3, 4, 5];
let first = &v[0];
assert_eq!(get_var_type(first), "&i32");
}
#[test]
fn use_vec_base3() {
let mut arr = vec![100, 101, 102];
for item in &arr {
assert_eq!(get_var_type(item), "&i32");
}
for item in &mut arr {
*item += 1;
assert_eq!(get_var_type(item), "&mut i32");
}
for item in &mut arr {
assert_eq!(get_var_type(item), "&mut i32");
}
for item in &mut arr {
assert_eq!(get_var_type(&item), "&&mut i32");
func(item);
func(item);
}
fn func(pa: &mut i32) {
*pa += 1;
}
assert_eq!(&arr, &[103, 104, 105]);
for item in arr {
assert_eq!(get_var_type(item), "i32");
println!("{}", item);
}
}
#[test]
fn use_vec_base4() {
#[derive(Debug)]
enum SpreadsheetCell {
Int(i32),
Bint(u128),
Float(f64),
}
let e1 = SpreadsheetCell::Int(3);
assert_eq!(get_val_size(&e1), 24);
let e2 = SpreadsheetCell::Bint(2);
let e3 = SpreadsheetCell::Float(10.12);
let vec = vec![e1, e2, e3];
println!("{:?}", vec);
assert_eq!(get_val_size(&vec), 24);
let e1 = SpreadsheetCell::Int(3);
let e2 = SpreadsheetCell::Bint(2);
let e3 = SpreadsheetCell::Float(10.12);
let arr = [e1, e2, e3];
assert_eq!(get_val_size(&arr), 72);
}
#[test]
fn vec_macro_self_need_mem() {
let x = 100;
let y = 1000;
let arr = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, x, y];
let z = 100;
println!(" {:p}", &x);
println!(" {:p}", &y);
println!("{:p}", &arr);
println!(" {:p}", &z);
}
#[test]
fn use_double_queue() {
use std::collections::VecDeque;
let mut queue = VecDeque::new();
queue.push_back(1);
queue.push_back(2);
queue.push_front(0);
queue.push_front(-1);
let mut iter = queue.into_iter();
assert_eq!(iter.next(), Some(-1));
assert_eq!(iter.next(), Some(0));
assert_eq!(iter.next(), Some(1));
assert_eq!(iter.next(), Some(2));
assert_eq!(iter.next(), None);
}
#[test]
fn use_linked_list() {
use std::collections::LinkedList;
let mut list = LinkedList::new();
list.push_back(1);
list.push_back(2);
list.push_front(0);
list.push_front(-1);
}
#[test]
fn use_hash_map1() {
use std::collections::HashMap;
let mut scores = HashMap::new();
let color1 = String::from("Blue");
let color2 = String::from("Red");
scores.insert(color1, 10);
scores.insert(color2, 50);
let team_name = String::from("Blue");
let score = scores.get(&team_name);
assert_eq!(score, Some(&10));
assert_eq!(get_var_type(score), "core::option::Option<&i32>");
let val = scores["Blue"];
assert_eq!(val, 10);
assert_eq!(get_var_type(val), "i32");
for (key, value) in &scores {
assert_eq!(get_var_type(key), "&alloc::string::String");
assert_eq!(get_var_type(value), "&i32");
println!("{}: {}", key, value);
}
for (key, value) in &mut scores {
*value += 1;
assert_eq!(get_var_type(key), "&alloc::string::String");
assert_eq!(get_var_type(value), "&mut i32");
}
println!("{:?}", scores);
for (_, value) in &mut scores {
*value -= 1;
}
println!("{:?}", scores);
scores.insert(String::from("Blue"), 11);
scores.insert(String::from("Blue"), 25);
println!("{:?}", scores);
scores.entry(String::from("Yellow")).or_insert(1);
scores.entry(String::from("Blue")).or_insert(1000);
println!("{:?}", scores);
assert_eq!(scores.get("heheda"), None);
if scores.get("heheda") == None {
println!("score not have heheda");
}
let ent = scores.entry(String::from("Yellow")).or_insert(0);
*ent += 1;
assert_eq!(get_var_type(ent), "&mut i32");
println!("{:?}", scores);
}
#[test]
fn use_custom_hash() {
use std::collections::HashMap;
#[derive(Hash, PartialEq, Eq)]
struct Point {
x: i32,
y: i32,
z: i32,
}
let mut dict = HashMap::new();
dict.insert(Point {
x: 0, y: 1, z: 2 }, 0);
dict.insert(Point {
x: 2, y: 1, z: 2 }, 2);
dict.insert(Point {
x: 3, y: 1, z: 2 }, 3);
let mut key = Point {
x: 0, y: 1, z: 2 };
assert_eq!(dict.get(&key), Some(&0));
key.x = 2;
assert_eq!(dict.get(&key), Some(&2));
key.x = 3;
assert_eq!(dict.get(&key), Some(&3));
key.x = 4;
assert_eq!(dict.get(&key), None);
}
common.rs
pub fn get_var_type<T>(_: T) -> &'static str {
std::any::type_name::<T>()
}
pub fn get_val_size<T>(val: &T) -> usize {
std::mem::size_of_val::<T>(val)
}
config.rs
const_var.rs
use super::common::*;
const MAX_U32: u32 = 0xffffffff - 1;
const MAX_I8: i8 = 127;
const PI: f64 = 3.1415926535897932384668765413265764651313654;
const MY_NAME: &str = "zhang xiao san";
const fn make_const_five() -> u32 {
let mut result = 10;
result += 1;
result -= 1;
result + 2 - 2
}
#[test]
fn use_global_constant() {
let arr = [0.5f32; make_const_five() as usize];
assert_eq!(get_var_type(arr), "[f32; 10]");
println!("global const MAX_U32 address {:p}", &MAX_U32);
println!("global const MAX_I8 address {:p}", &MAX_I8);
println!("global const PI address {:p}", &PI);
println!("global const MY_NAME address: {:p}", &MY_NAME);
println!("make_const_five add:{:p}", &make_const_five());
}
#[test]
fn change_global_const() {
println!("change_global_const");
}
#[test]
fn use_local_constant() {
const MIN_INT8: i8 = -128;
const MAX_INT8: i8 = 127;
let x = 0;
println!("local car x address: {:p} ", &x);
println!("local const MIN_INT8 address: {:p}", &MIN_INT8);
println!("local const MAX_INT8 address: {:p}", &MAX_INT8);
}
expression.rs
#[test]
fn brace_is_expr() {
let y = {
let x = 3;
x + 1
};
assert_eq!(y, 4);
}
#[test]
fn expr_err() {
}
#[test]
fn use_println() {
#[derive(Debug)]
struct Point {
x: i32,
y: i32,
}
let p = Point {
x: 12, y: 2048 };
println!("{:?}", p);
println!("{:b}", 255);
println!("{:o}", 255);
println!("{:x}", 255);
println!("{:X}", 255);
println!("{:e}", 255);
println!("{:E}", 255);
let x = 0;
println!("{:p}", &x);
}
function.rs
fn _add_function1(x: i32, y: i32) -> i32 {
return x + y;
}
fn _add_function2(x: i32, y: i32) -> i32 {
x + y
}
#[test]
fn function_in_function() {
fn func1() -> () {
println!("func1");
()
}
func1();
func2();
fn func2() {
println!("func1");
()
}
}
#[test]
fn use_function_ptr() {
fn add_one(x: i32) -> i32 {
x + 1
}
fn do_twice(f: fn(i32) -> i32, arg: i32) -> i32 {
f(arg) + f(arg)
}
let answer = do_twice(add_one, 5);
assert_eq!(answer, 12);
let answer = do_twice(|num| num + 1, 5);
assert_eq!(answer, 12);
}
genericity.rs
use super::common::*;
#[test]
fn genric_function_test1() {
fn _get_max_value1<T: PartialOrd>(slice: &[T]) -> &T {
let mut result = &slice[0];
for elem in slice.iter() {
if result < elem {
result = elem;
}
}
result
}
fn _get_max_value2<T: PartialOrd + Copy>(slice: &[T]) -> T {
let mut result = slice[0];
for &elem in slice.iter() {
if result < elem {
result = elem;
}
}
result
}
fn _get_max_value3<T>(slice: &[T]) -> T
where
T: PartialOrd + Copy,
{
slice[0]
}
}
#[test]
fn genric_struct_test1() {
struct Point<T> {
_x: T,
_y: T,
}
let _integer = Point {
_x: 5, _y: 10 };
let _float = Point {
_x: 1.0, _y: 4.0 };
}
#[test]
fn genric_struct_test2() {
struct Point<T, K> {
_x: T,
_y: K,
}
let _1 = Point {
_x: 5, _y: 10u8 };
assert_eq!(
get_var_type(_1),
"hello_rust::genericity::genric_struct_test2::Point"
);
let _2 = Point {
_x: 5, _y: 4.0 };
assert_eq!(
get_var_type(_2),
"hello_rust::genericity::genric_struct_test2::Point"
);
let _3 = Point {
_x: "zhang san",
_y: String::from("li si"),
};
assert_eq!(
get_var_type(_3),
"hello_rust::genericity::genric_struct_test2::Point<&str, alloc::string::String>"
);
}
#[test]
fn genric_function_test2() {
struct _Point<T> {
x: T,
y: T,
}
impl<T> _Point<T> {
fn _get_x(&self) -> &T {
&self.x
}
}
impl _Point<f32> {
fn _distance_from_origin(&self) -> f32 {
(self.x.powi(2) + self.y.powi(2)).sqrt()
}
}
let _p1 = _Point {
x: 1, y: 2 };
let p2 = _Point {
x: 1.0f32,
y: 2.0f32,
};
let _dis = p2._distance_from_origin();
}
#[test]
fn genric_function_test3() {
struct Point<T, U> {
x: T,
y: U,
}
impl<T, U> Point<T, U> {
fn mixup<V, W>(self, other: Point<V, W>) -> Point<T, W> {
Point {
x: self.x,
y: other.y,
}
}
}
let p1 = Point {
x: 5, y: 10.4 };
assert_eq!(
get_var_type(&p1),
"&hello_rust::genericity::genric_function_test3::Point"
);
let p2