rustp-16.使用别人包的例子
以求哈希为例子
123456789[package]name = "list"version = "0.1.0"edition = "2021"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies]rust-crypto = "0.2" //使用外部的包
src/main.rs
12345678910use crypto::digest::Digest;use crypto::sha3::Sha3;fn main() { let mut hasher = Sha3::sha3_256(); hasher.input_str("Hello world"); let result = hasher.result_str(); //求出的哈希值 println!("Hello wor ...
rustp-15.cargo自定义构建
Cargo运行的版本
Cargo运行
cargo运行会产生运行文件,在target/debug文件夹之下
cargo运行产生可执行文件
123cargo new list# 编辑完src/main.rscargo run
可执行文件的位置
12345678910Cargo.tomlCargo.locksrc------- | ------main.rstarget---- | ------Debug----- | -------list //可执行文件
Cargo编译
1cargo build
同样也会生成可执行文件
Cargo编译 release发布
编译发布会产生release文件夹
1cargo build --release
文件结构
123456789101112Cargo.tomlCargo.locksrc------- | ------main ...
rustp-14.自定义迭代器
1234567891011121314151617181920212223242526272829303132struct Counter { count: u32, }impl Counter { fn new() -> Counter { Counter { count: 0, } } }impl Iterator for Counter { type Item = u32; fn next(&mut self) -> Option<Self::Item> { self.count += 1; if self.count < 6 { Some(self.count) } else { None } ...
rustp-13.迭代器
迭代器负责遍历序列中的每一项和决定序列合适结束的逻辑
创建迭代器: 迭代器是惰性的,调用迭代器之前不会有任何效果
每个迭代器实现了iterator trait,iterator定义在标准库之中
12345678fn main() { let v1 = vec![1,2,3]; let v1_iter = v1.iter();//这里虽然定义了迭代器,但是迭代器不产生效果 //迭代器是惰性的 for val in v1_iter { println!("val = {}",val); }}
Iterator的定义
next 是Iterator被要求实现的惟一一个方法,next一次返回一个元素,
迭代器结束的时候返回None
123456trait Iterator { type Item; fn next(mut self) -> Option<Self::Item>; //type item和Self ...
rustp-12.闭包获取环境中的值
闭包获取环境中的值
闭包通过三种方式从环境中捕获变量,对应三种获取参数的方式,分别是所有权、可变
借用、不可变借用。
三种捕获的方式被编码为如下三个Fn trait :
FnOnce消费从周围作用域中捕获的变量,周围的作用域被称作其环境,为了消费捕获
到的变量,闭包必须获取所有权并且在闭包定义的过程中将其移动至闭包内部,Once代表
不能够多次获取相同变量所有权
FnMut获取可变的借用值,可以改变作用环境
Fn从环境中获取不可改变的借用值
rust通过自己的编译器来推导用户的闭包如何使用:
所有的闭包都实现了FnOnce,因为所有闭包都至少被调用一次。
并且在闭包的调用过程中没有移动被捕获变量的所有权到闭包的闭包实现了FnMut,
不需要对捕获的变量进行可变访问的闭包实现了Fn
123456fn main() { let x = 4; let equal_to_x = |z| z == x; //x为环境中的变量 let y = 4; assert!(equal_to_x(y)); }
move关键字会将所有权移进闭包
12 ...
rustp-11.使用泛型和Fn-trait的闭包
使用泛型和Fn trait 的闭包
1234567891011121314151617181920212223242526272829303132333435//实现一个缓存,只处理第一次传入的值并保存struct Cacher<T> where T: Fn(u32) -> u32 //这里的Fn trait有一个回调,是这个函数自带的 { calcuation: T, value: Option<u32>, }impl<T> Cacher<T> where T: Fn(u32) -> u32{ fn new(calcuation: T) -> Cacher<T> { Cacher { calcuation, //当传入参数和函数体字段重名的时候,可以省略参数类型声明 value: None, } ...
rustp-10.闭包
闭包
闭包是一种匿名函数,用来保存进变量 或者作为参数传递给其他函数,但是和函数不同
的是允许捕获调用者作用域中的值
闭包可以带有泛型,Fn trait。
闭包可以为返回类型和参数推断类型,所以可以省略部分
简单的闭包使用方法
1234567fn main() { let use_closure = || { println!("This is a closure"); }; use_closure(); println!("Hello world!");}
闭包的语法格式
123456789101112//函数的实现方式fn add_one_v1(x: u32) -> u32 { x+1}//闭包的实现方式let add_one_v2 = |x: u32| -> u32 {x + 1}; //-------------------------------- //省略方法//没有写类型和返回值let add_one_v3 = ...
rustp-9.静态生命周期
静态生命周期
12345678910111213141516171819202122232425//1.静态生命周期//定义方法:'static//生命周期存活于整个程序期间,所有的字符字面值都有static生命周期//和C语言不同,C语言中static则是更换文件链接属性或者全局变量,Rust使用const//let s: &'static str = "hello";use std::fmt::Display;fn function<'a,T:Display>(x: &'a str,y: &'a str,ann: T) -> &'a str { println!("ann is {}",ann); if x.len() < y.len() { x }else { y } }fn main() ...
rustp-8.方法中的生命周期
12345678910111213141516171819202122232425262728293031323334struct StuA<'a> { name: &'a str, }impl<'a> StuA<'a> { fn do_something(&self) -> i32 { //输出不是引用,所以不用写 3 } fn do_something2(&self,s: &str) -> &str { //省略规则3 //fn do_something2<'b>(&'b self,s: &str) -> &'b str { self.name } //报错 //需要显示标明// fn do_something3(&a ...
rustp-7.生命周期的省略
生命周期的省略
生命周期的省略有如下三个规则:
每个引用参数(注意是引用的参数 )都有他自己的生命周期参数:
一个引用参数的函数,其中有一个生命周期:1fn foo<'a>(x: &'a i32)
两个引用参数的函数,有两个生命周期:1fn foo<'a,'b>(x: &'a i32,y:&'b i32)
如果只有一个输入生命周期参数,所有的输出生命周期参数会得到同样的生命周期123fn foo(x:&i32) ->&i32 //等价于fn foo<'a>(x: &'a i32) -> &'a i32
在方法方法不同于普通的函数,它有self参数 中,如果有多个输入
生命周期,但是其中一个是&self或者&mut self,那么self的生命周期被赋予所有输出生
命周期参数。1234//伪代码fn function(&self,x:&str,y:& ...