整理来自Rust中文前几章节,到
包、Crates与模块
.已经看了第二遍,知识点还是容易忘记,整理记录一下,方便查阅.
Rust中文
x.0;
元祖
let a: [i32; 5] = [1, 2, 3, 4, 5];
fn关键字
表达式
和语句 表达式用于返回值,无冒号
因为 if 是一个表达式,我们可以在 let 语句的右侧使用它
栈中的所有数据都必须占用已知且固定的大小
已实现COPY
字符串字面值不可变性在栈上
String存在堆上,因为大小未知
let x = 5;
let y = x;
println!("{}",x)
栈上数据没问题,实现了copy trait
let s1 = String::from("hello");
let s2 = s1;
println!("{}",s1)
堆上数据报错,s1被move给了s2
Rust 永远也不会自动创建数据的 “深拷贝" clone
Drop trai和Copy trait不可同时出现
元组,当且仅当其包含的类型也都是 Copy 的时候。比如,(i32, i32) 是 Copy 的,但 (i32, String) 就不是。
我们将获取引用作为函数参数称为 借用(borrowing)
引用产生生命周期问题
iter 方法返回集合中的每一个元素,而 enumerate 包装 iter 的结果并返回一个元组
let slice = &s[..];
字符串slice的类型声明&str
当拥有某值的不可变引用时,就不能再获取一个可变引用
数组slice &[i32]
字段初始化简写语法
..user1结构体更新语法
struct Color(i32, i32, i32);元组结构体
类单元结构体()
&self只是借用
自动引用和解引用
当使用 object.something() 调用方法时,Rust 会自动为 object 添加 &、&mut 或 * 以便使 object 与方法签名匹配
::关联函数用于构造对象,.属于结构体方法
match 一个枚举,绑定其中的值到一个变量,接着根据其值执行代码
if let 语法让我们以一种不那么冗长的方式结合 if 和 let,来处理只匹配一个模式的值而忽略其他模式的情况
可以认为 if let 是 match 的一个语法糖
路径(path)是一个命名例如结构体、函数或模块等项的方式
因为 Cargo 创建了 Cargo.toml,这意味着现在我们有了一个包。如果查看 Cargo.toml 的内容,会发现并没有提到 src/main.rs。然而,Cargo 的约定是如果在代表包的 Cargo.toml 的同级目录下包含 src 目录且其中包含 main.rs 文件的话,Cargo 就知道这个包带有一个与包同名的二进制 crate
包可以带有多个二进制 crate,需将其文件置于 src/bin 目录;每个文件将是一个单独的二进制 crate。
绝对路径(absolute path)从 crate 根开始,以 crate 名或者字面值 crate 开头。
相对路径(relative path)从当前模块开始,以 self、super 或当前模块的标识符开头。
use self::instrument;在lib下面使用
对于结构体、枚举和其它项,通过 use 指定项的全路径是习惯用法
as防止同名冲突
可以结合 pub 和 use。这个技术被称为 “重导出”(re-exporting)
use std::io::{self, Write};合并两个use导入
lib的调用
extern crate my_library;
extern crate也应该位于根模块
(即src/main.rs或src/lib.rs中
可以使用*语法,也称glob运算符
将某个命名空间下的所有名称
引入作用域:use TrafficLight::*;
使用super关键字
访问父模块:super::client::connect();
use self::xxx 表示,加载当前模块中的 xxx。此时 self 可省略;
use xxx::{self, yyy},表示,加载当前路径下模块 xxx 本身,以及模块 xxx 下的 yyy;
::xxx::yyy
它表示,引用根路径下的 xxx::yyy,这个根路径,指的是当前 crate 的根路径。
pub use b::c::d; 底层方法导出
extern crate xxx;这样来引入的。
要使上述引用生效,还必须在 Cargo.toml 的 dependecies 段,加上 xxx=“version num” 这种依赖说明,详情见 Cargo 项目管理 这一章。
git引用
color = { git = “https://github.com/bjz/color-rs” }