command
切换
rustup update stable
rustup update nightly
rustup default nightly
rustup toolchain install nightly --component rust-docs rustfmt rls clippy miri rust-src rust-analysis
convert
元编程
rust-web-developer-roadmap
rust wasm
论坛话题
本周更新
rust dev
MISC 文章
rust
更新 rust 版本
config
rust 源
放入地址$HOME/.cargo/config
[source.crates-io]
replace-with = 'ustc'
[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"
[http]
check-revoke = false
web 选型
备注
建立 bin 文件夹 可以指定运行相应文件。 也可以在 cargo.toml 定义。 如 cargo run --bin show_error
生态
- 时间库的超集 chrono
- 序列化 serde
- 异步库 future
- 请求库
- 环境变量 dotenv
- 字节 bytes
异步
- futures::future::Future 是由异步计算得到单个最终值
- futures::stream::Stream 是一系列异步产生的值
- futures::sink::Sink 数据的异步写入支持
- futures::executor 是负责运行异步任务
- futures::io 异步 IO 的抽象
- futures::channel 跨任务交流
所有的这些基础是任务系统, 一种轻量级的线程, 大量异步计算是由 futures, streams, sink, 组合派发成独立任务进行计算, 但不 block 运行他们的线程.
重任务可以在 future::executor::ThreadPool 完成. 一个工作线程可以派生大量任务, spawn_ok() 可以分发至池中. crate::executor::LocalPool 可以分发至单线程之中. spawn_local_obj 最适合 I/O 类任务. block_on 是最方便的函数在当前线程中完成.
其他
允许驼峰法
#![allow(non_snake_case)]
文件结构
.
├── Cargo.lock
├── Cargo.toml
├── src
├── bin
│ ├── server.rs
│ ├── foo.rs
│ └── parsing (/mod.rs)
│ └── others (/mod.rs)
│ ├── lib.rs
如果是在 bin 文件夹的 bin proc 访问 某包的内容 需要
extern crate <your_crate_name>;
use <your_crate_name>::parsing;
在 lib.rs 文件夹 需要开放相应的模块 如
pub mod parsing;
主 package 下面 访问相应模块只需要
pub mod xxx;
如果是建立了新的文件夹, 要进行文件分层 需要在文件夹中建立一个 mod.rs 文件, 作为访问入口
rust 简单语法总结
函数定义 fn 内部注释 // /* ... /
文档说明 /// //!
primitive 基元 Scalar Types: signed integers: i8, i16, i32, i64, i128 and isize (pointer size) unsigned integers: u8, u16, u32, u64, u128 and usize (pointer size) floating point: f32, f64 char Unicode scalar values like 'a', 'α' and '∞' (4 bytes each) bool either true or false and the unit type (), whose only possible value is an empty tuple: () 标注类型的时候 既可以规范标注 或者后缀标注
Compound Types arrays like [1, 2, 3] tuples like (1, true) 变量默认是不可变的 可以加入关键字 mut 进行变更.
tuple 是一个不同类型值的集合 直接用()表示 函数可以多值返回 let 可以用于构造解析
精确访问 println!("long tuple first value: {}", long_tuple.0); println!("long tuple second value: {}", long_tuple.1);
嵌套表达
打印 println!("tuple of tuples: {:?}", tuple_of_tuples); 但是太长的会出现编译错误 可以进行反转 reverse(pair)
数组是同样类型的对象集合,储存在连续空间中. 空间大小是在编译时就确定了. 标注表达是 [T; size] 入[i32;5]
slice 有点像数组, 但是大小不定, 大小取决于处理器的架构. 标注表达是&[T]
获得数组大小 // Arrays are stack allocated println!("array occupies {} bytes", mem::size_of_val(&xs));
类 js [].slice() analyze_slice(&ys[1 .. 4]);
超出数组长度会在编译期出错
struct: define a structure enum: define an enumeration Constants can also be created via the const and static keywords. 自定义类型
类型转换 用 as 转换规则跟 c 转换方式一致 除了 c 未定义的行为 基本类型所有的类型转换都是可以的. 不可以隐性转换
std::mem::size_of_val() 取得对象大小
流程控制
loop 循环块 continue 跳过剩下的代码 break 退出循环
while 循环 for 循环 考虑 for in 1..100 但不会达到 100 除非是 ..=
https://doc.rust-lang.org/stable/rust-by-example/flow_control/while_let.html https://doc.rust-lang.org/stable/rust-by-example/flow_control/if_let.html 可以用于减少 match 的语句