Rust在arch中运行plotters的先决条件
先决条件
1sudo pacman -S cmake make git fontconfig pkgconf glibc llvm clang freetype2 expat
在cargo工作环境中添加images文件夹
123# /cargo工作环境mkdir imagescargo run
git2.git的下载和简单使用
git的下载
😘git官网地址链接😘
使用arch linux可以直接使用以下命令安装:
1sudo pacman -S git
git1.简单介绍
版本控制系统
git是一种版本控制系统,当你撤回版本,发布新版本时会有很大的便捷性和逻辑性
VCS版本控制系统
工作方式
一个团队中有三个人,这三个人需要在服务器端的git仓库中提交代码,
首先由主要负责人搭建框架,然后在框架中修改,
其余两个人分别完成部分项目,三个人并行开发。
三个人提交的方式都是:
(1) 从中央仓库提取代码
(2) 写完功能提交仓库
(3) 其他人提交到中央仓库的内容及时保存
DVCS
git应用这种控制系统
每个成员不仅仅在服务器端有仓库,同时需要在自己的机器上有本地仓库,本地仓库中包含
了众多历史版本,你需要在本地仓库中交互,而不需要直接在中央仓库中交互。
工作方式:
(1) 工程师将框架搭建,然后将代码提交到本地仓库.
(2) 工程师在服务器中创建中央仓库,将本地仓库中内容提交到中央仓库
(3) 其他人将中央仓库中内容复制到本地仓库
(4) 每个人独立开发部分内容,完成后,在本地仓库中提交到中央仓库
(5) 其他人将新提交的内容复制到本地仓库完成合并
区别
DVCS的优点:
DVCS的操作可以在本地进行,所以速度更快,无需联网也似地提交代码更加方 ...
rustp-42.宏
Rust中的宏
Rust中的宏主要有两种,一种是使用macro_rules!的声明宏,一种是过程宏,过程宏又
分成三种:
(1) 自定义宏#[derive],在结构体、枚举等上指定通过derive属性添加代码
(2) 类属性宏,定义可以用于任意项的自定义属性
(3) 类函数宏,看起来像是函数,但是作用于作为参数传递的Token
宏和函数
(1) 宏是一种为写其他代码而写代码的方式,对于减少大量编写代码和维护代码非常有用
(2) 一个函数标签必须声明函数参数的个数和类型,宏只接受可变参数
(3) 宏的定义比函数定义更加复杂
(4) 调用宏之前,必须定义并且将其引入作用域,函数但是可以在任何地方调用和定义
声明宏
1let v = vec![1,2,3];
创建自己的声明宏
123mkdir learncd learnvim Cargo.toml
之后,进行设置
123456//learn/Cargo.toml[workspace]members = [ "mac", "main",]
创建mac lib
123cargo ...
cargo镜像的修改
修改cargo镜像
12cd ~/.cargovim config
之后在这个文件中输入以下源信息:
12345[source.crates-io]registry = "https://github.com/rust-lang/crates.io-index"replace-with = 'ustc'[source.ustc]registry = "git://mirrors.ustc.edu.cn/crates.io-index"
rustp-41.高级函数和闭包
函数指针
函数指针被允许使用函数作为另一个函数的参数,函数的类型是fn,fn就是一种函数指针,
指定参数为函数指针的语法类似闭包
函数指针实现了闭包的三个特征:Fn、FnMut、FnOnce,因此,可以在闭包中调用函数指针
1234567891011121314151617181920212223242526fn add_one(x: i32) -> i32 { x + 1}fn do_twice(f: fn(i32) -> i32,val: i32) -> i32 {//第一个参数是一个函数指针,类型是 //参数为i32,返回值为i32的函数 f(val)+ f(val)}fn wapper_func<T>(t: T,v: i32) -> i32 where T: Fn(i32) -> i32 {//T类型必须实现Fn特征 t(v)}fn fnc(v: i32) -> i3 ...
rustp-40.高级类型
高级类型
类型别名
类型别名的作用:
减少重复
(1) 例如如下的代码(trait 对象):
Box<dyn Fn() + Send + 'static>
123456let f: Box<dyn Fn() + Send + 'static> = Box::new(|| println!("hi"));fn takes_long_type(f: Box<dyn Fn() + Send + 'static>) { }fn returns_long_type (f: Box<dyn Fn() + Send + 'static>) {}
修改为别名
12type Trunk = Box<dyn Fn() + Send + 'static>;let f: Trunk = Box::new(|| println!("hi"));
(2) 例子2
12345678910111213141516171819use s ...
rustp-39.高级特征
高级特征
关联类型
之前的例子中出现过Item这个占位符
关联类型在trait中指定占位符类型
(1) 关联类型是一个将类型占位符与trait相关联的方式
(2) trait的实现者会针对特定的实现在这个类型的位置指定相应的具体类型,可以通过这样使用多种类型的trait
1234pub trait Iterator { type Item; fn next(&mut self) -> Option<Self::Item>; }
泛型和关联类型的区别
123456789101112131415161718192021222324252627282930313233343536pub trait Iterator1<T> { fn next(&mut self) -> Option<T>; }struct A { value: i32, }impl Iterator1<i32> for A { fn n ...
rustp-38.不安全rust
不安全的Rust
不安全的Rust拥有以下能力:
解引用裸指针
调用不安全的函数或者方法
访问或修改可变静态变量
实现不安全的trait
这种方法不会关闭rust中的借用检查器或者禁用任何其他的rust安全检查规则,只提供上述
几个不被编译器检查内存安全的功能,这种代码的正确与否,由程序员自己保证
解用裸指针
裸指针分为两种:
不可变裸指针:const T(这里的是const连用的,并不是解引用的*,写法就是如此)
可变裸指针: *mut T(同上)
(1) 允许忽略借用规则,可以同是拥有不可变和可变的指针,或者是多个指向相同位置的
可变指针
(2) 不保证指向的内存有效
(3) 允许为空
(4) 不能实现任何自动清理的功能
123456789101112131415161718192021fn main() { let mut num = 5; //创建不可变和可变的裸指针是可以安全在代码中,只是不能在不安全代码块之外解引用 //裸指针 let r1 = &num as *const i32; //不可变裸指针 let r ...
rustp-37.模式匹配
模式
模式是Rust中特殊的语法,用来匹配值的结构
组成:
(1) 字面值
(2) 解构的数组、枚举、结构体或者元组
(3) 变量
(4) 通配符
(5) 占位符
match的例子
match必须匹配完所有的情况
123456789101112131415//1.match//match VALUE {// PATTERN => EXPRESSION,// PATTERN => EXPRESSION,// PATTERN => EXPRESSION,// }fn main() { let a = 1; match a { 0 => println!("Zero"), 1 => println!("One"), _ => println!("other value"), };}
if let
1234567891011121314151617181920fn main() ...