Posts by Topic: Rust
rust学习(五)迭代器和闭包
Li Guangqiao - 16/07/2023
函数式编程 Rust不像其他面向对象编程语言那样喜欢通过类来解决问题,而是推崇函数式编程。 什么是函数式编程 函数式编程是指将函数作为参数值或其他函数的返回值,在将函数赋值给变量之后执行。其中函数式编程的两个重要构件,分别是闭包和迭代器。 闭包 闭包是一种可以保存变量或者作为参数传递给其他函数使用的匿名函数。闭包可以在一处创建,然后在不同的上下文中执行。与普通函数不同,闭包允许捕获调用者作用域中的值,闭包特别适合用来定义那些只使用一次的函数。 //伪代码 //定义普通函数 fn func_name(func_parameter) -> func_return_type{ code_body; return_type } //定义闭包 |func_parameter| { code_body; return_value } 注意: 闭包也可能没有参数,同时返回值也可写可不写。Rust会自动推断闭包的参数类型和返回值类型,所以参数和返回值类型都可以不写。为了使用闭包,只需要将其赋值给变量,然后像调用函数一样调用它即可。 let count = |x:i32|->i32 { x+1 }; let num = 3; ...
rust学习(六)智能指针
Li Guangqiao - 16/07/2023
智能指针 概念 指针是包含内存地址的变量,用于引用或只想其他的数据。 Rust中最常见的指针是引用,而引用只是一种普通指针,除了引用数据之外,没有其他功能, 智能指针则是一种数据结构,其行为类似于指针,含有元数据,且在大部分情况下拥有指向的数据,提供内存管理或者绑定检查等附加功能,如管理文件句柄和网络连接。例如Rust中的Vec、String都可以看作智能指针。 Rust语言为智能指针封装了两大Trait,当变量实现了这两个Trait后就不再是普通变量: Deref 实现了Deref后,变量重载了解引用运算符*****,可以当作普通引用来使用,必要时可以自动或手动实现解引用。 Drop 实现Drop后,变量在超出作用域时会自动从堆中释放,当然还可以自定义实现其他功能,如释放文件或网络连接。 特征 智能指针在大部分情况下具有其所指向数据的所有权 智能指针是一种数据结构,一般使用结构体来实现 智能指针实现了Deref和Drop两个大trait 名称描述实际作用 Box<T>一种独占所有权的智能指针指向存储在堆上且类型为T的数据 Rc<T>一种共享所有权的计数智能指针用于记录存储在堆上的值的引用数 Arc<T>一种线程安全的共享所有权的计数智能指针可用于多线程 Cell<T>一种提供内部可变性的容器,不是智能指针允许借用可变数据,编译时检查,参数T要求实现Copy trait RefCell<T>一种提供内部可变性的容器,不是智能指针允许借用可变数据,运行时检查,参数T不要求实现Copy trait Weak<T>一种与***Rc<T>***对应的弱引用类型用于解决***RefCell<T>***中出现的循环引用。 Cow<T>是一种写时复制的枚举体智能指针我们使用***Cow<T>***主要是为了减少内存分配和复制,***Cow<T>***适用于读多写少的场景。 Pin<T>Rust 标准库中的另一种智能指针类型用于解决在异步编程和使用不稳定的 APIs 时,对象被移动的问题。Pin 可以用于固定***(pin)***一个对象的内存地址,确保它不会被移动。 自定义智能指针 定义一个结构体MYBOX use std::ops::Deref; //定义一个泛型参数的元组结构体 struct MYBOX<T>(T); //为元组结构体实现一个创建实例的方法 impl<T> MYBOX<T> { fn new(x:T) -> Self{ Self(x) } } 结构体实现Deref特征 impl<T> Deref for MYBOX<T> { type Target = T; fn deref(&self) -> &Self::Target { ...
rust学习(三)泛型和特征对象
Li Guangqiao - 15/07/2023
泛型和特征对象 泛型解决了多种数据类型可共用一个方法的问题,而特征对象(trait)则提供一种定义和限制泛型行为的方法,特征对象(trait)中封装各类型共享的方法 泛型例子: use std::ops::Add; fn add_i8(a:i8,b:i8) -> i8 { a+b } fn add_i16(a:i16,b:i16) -> i16 { a+b } fn add_i32(a:i32,b:i32) -> i32 { a+b } fn add<T:std::ops::Add + Add<Output = T>>(a:T,b:T) -> T { a+b } fn add_test(){ println!("{}",add_i8(1,2)); println!("{}",add_i16(1,2)); ...
rust学习(二)所有权和生命周期
Li Guangqiao - 15/07/2023
Rust所有权机制 Rust语言引入所有权机制的目标 主要为解决复杂系统中的资源管理和悬吊引用问题。 所有权系统是Rust中用于管理内存的手段。 所有权规则总结归纳: 每个值(变量)都有一个所有者 值在任意时刻都只有一个所有者 当所有离开作用域时,其值将被丢弃(相当于执行垃圾回收) 结论:Rust的值被唯一的对象管理着,一旦不使用,内存就会立刻释放。 所有权简单实验 借用 let x = String::from("hello"); let y = &x; 克隆 let x = 10; let y = x; println!("测试通过{x},{y}"); //测试通过10,10 let a = "hello"; let b = a; println!("测试通过{x},{y}"); let c = (1,2 as f64,"hello"); let d = c; println!("测试:{:?},{:?}",c,d); let g = d.clone(); 生命周期 静态生命周期***'static和动态生命周期'a*** 静态生命周期在整个程序中期间存活 动态生命周期,相关参数的生命周期以相对长生命周期的引用为准 fn lifetime_test_one() -> &String{ let x= "hello".to_string(); ...