简介
Rust 是 基于表达式的语言
安装
https://www.rust-lang.org/zh-CN/tools/install
rust .cargo .rustup
%CARGO_HOME% %RUSTUP_HOME%
参考 https://cloud.tencent.com/developer/article/2384287
cargo
包管理工具最重要的意义就是任何用户拿到你的代码,都能运行起来,而不会因为各种包版本依赖焦头烂额。
1cargo new # 创建新项目
2cargo run # debug运行项目
3
4cargo run --release
5cargo build --release
6
7cargo check # 编译检查
8cargo test # 自动执行 src下的单元测试 和tests下的集成测试 (还有examples下的示例
编译速度似乎不如golang,优化部分作者没写,TODO
cargo.lock 文件自动包含创建时 依赖的最新版本,后续需要手动更新
1cargo update # 更新所有依赖
2cargo update -p regex # 只更新"regex"
cargo使用缓存提高构建效率,依赖包放在 CARGO_HOME
目录下
零碎
!
是宏操作符
for 隐式將集合转换成迭代器
Vec<_> _
表示由编译器推断
if let 匹配表达式
使用_开头的变量名,会忽略未使用警告
const常量必须标注值的类型
!
返回值永不返回 发散函数 diverge function
()
单元类型 零长度元组 不占内存
函数没有返回值,那么返回一个 ()
通过 ; 结尾的语句返回一个 ()
:: 是一种调用操作符,调用该类型的关联函数
clone 深拷贝操作
Copy特征 任何基本类型的组合可以 Copy ,不需要分配内存或某种形式资源的类型是可以 Copy 的
元组,当且仅当其包含的类型也都是 Copy 的时候
可变引用 &mut T 是不可以 Copy的
传参 返回值 也会有所有权变动
可变的引用 &mut s ,需要先创建 然后再传参
同一作用域 只能有一个可变引用
可以通过 {} 手动限制变量的作用域
可变引用与不可变引用不能同时存在
只使用基本类型的局限性:无法从更高的抽象层次去简化代码。
切片是对集合的部分引用 [开始索引..终止索引]
字符串切片时要注意UTF-8字符占用内存情况
字符是 Unicode 类型,每个字符占据 4 个字节,但是字符串每个字符所占字节数是变化的(1-4),
不允许索引字符串,而且索引操作 我们期望性能表现是 O(1),但是String需要遍历才能定位合法字符
使用+
连接字符串,右边的参数必须为字符串的切片引用
包含双引号的字符串使用#
包裹,包含#的字符串使用多个#
包裹
? 自动解包 Result 或 Option 类型,并且將错误自动传播
特殊名词
悬空指针(Dangling Pointer) 二次释放(double free) 浅拷贝(shallow copy) 和 深拷贝(deep copy) 移动(move) 借用(Borrowing) Non-Lexical Lifetimes(NLL) 悬垂引用(Dangling References) 生命周期(lifetimes) Deref 特征
编译器属性标记
1#![allow(unused_variables)]
2#[allow(dead_code)]
镜像
官方 crates.io
待处理
cargo add 添加依赖 cargo add serde –features derive // 并启用宏
derive宏 trait(特征)
chrono 用于日期时间处理 serde 用于序列化与反序列化