Rust 专栏 - 生态

2021-04-01

月报

//https://docs.rs/axiom/0.2.1/axiom/#:~:text=Getting%20Started,actors%20for%20all%20processing%20activities.&text=An%20actor%20can%20be%20interacted,process%20a%20message%20only%20once.

command

切换

rustup update stable
rustup update nightly

rustup default nightly

安装rust组件

rustup toolchain install nightly --component rust-docs rustfmt rls clippy miri rust-src rust-analysis

练习

convert

cfg宏的判断 Derive 宏

[#Derive(Debug)](https://stackoverflow.com/questions/46388386/what-exactly-does-derivedebug-mean-in-rust#:~:text=derive(Debug)%20asks%20the%20compiler,in%20something%20like%20format!()

元编程

rust-web-developer-roadmap

rust wasm

web-sys 接口

wasn-pack

论坛话题

本周更新

rust dev

MISC 文章

async-std

cargo-edit

sqlite

GUI SETS

GUI iced

yew

crud

full stack

cli params

rust

更新 rust 版本

config

rust 源

Rust Crates Registry 源

放入地址$HOME/.cargo/config
[source.crates-io]
replace-with = 'ustc'

[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"

[http]
check-revoke = false

cargo.toml auto reload

web 选型

diesel orm

备注

建立 bin 文件夹 可以指定运行相应文件。 也可以在 cargo.toml 定义。 如 cargo run --bin show_error

生态

异步

  • 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() 取得对象大小

类型推断

类型别名 - 主要用于减少模板代码

类型转换

字符串里 {}表达变量 {:?}求值表达式打印

流程控制

if else 没有括号

loop 循环块 continue 跳过剩下的代码 break 退出循环

多重 loop 的时候 如何退出

loop 如何返回值 break 后面传值

while 循环 for 循环 考虑 for in 1..100 但不会达到 100 除非是 ..=

match 语法 相当于 switch 解构判断

解构赋值 指针 引用

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 的语句

copyright ©2019-2024 shenzhen
粤ICP备20041170号-1