Rust学习过程主要参考阅读了《Rust圣经》、《Rust by Example》、和Rust之旅 之后的时间主要是对《Rust圣经》中的进阶部分和基础部分进行阅读笔记并复习,基础部分难点主要集中在所有权和特征这两个知识点上,对于生命周期以及包和模块的讨论并不是特别深入。进阶部分都难哈哈哈哈,迭代器和智能指针还算比较好理解些,对于迭代器加闭包实现的函数式编程每次都让我觉得很强大,Cell和RefCell提供的内部可变性加上智能指针也给程序提供了很大的灵活性的前提下保证了一定的安全性。生命周期的使用也是一大难点了。之后还有unsafe Rust的使用以及宏编程(对比C/C++的难的多但功能性也更强大)
match y { Some(p) => println!("Co-ordinates are {},{} ", p.x, p.y), _ => panic!("no match!"), } y;
这样写会报错(value used here after partial move),因为在最后返回 y 之前 Some(p)就已经把外面 y 的所有权移动到 p 上了,此时 y 指向的是一个无效的内存空间。所以现在的解决方案就是把外面 y 借用到 Some(p)之中,一个关键字 ref 可以帮助我们做到这一点。这个关键字其实用法还是挺多的,一般用于模式匹配:
error[E0507]: cannot move out of `borrowed_car.engine` as enum variant `Some` which is behind a shared reference --> src/main.rs:16:11 | 16 | match borrowed_car { | ^^^^^^^^^^^^ 17 | Some(&Car { engine }) => { | ------ | | | data moved here | move occurs because `engine` has type `Engine`, which does not implement the `Copy` trait | help: consider borrowing the pattern binding | 17 | Some(&Car { ref engine }) => { | +++
error[E0716]: temporary value dropped while borrowed --> src/main.rs:10:44 | 10 | let borrowed_car: Option<&Car> = Some(&Car { | ____________________________________________^ 11 | | engine: Engine { 12 | | version: String::from("混合动力"), 13 | | }, 14 | | }); | | ^ - temporary value is freed at the end of this statement | |_____| | creates a temporary value which is freed while still in use 15 | 16 | match borrowed_car { | ------------ borrow later used here | help: consider using a `let` binding to create a longer lived value | 10 ~ let binding = Car { 11 + engine: Engine { 12 ~ version: String::from("混合动力"), 13 + }, 14 + }; 15 ~ let borrowed_car: Option<&Car> = Some(&binding); |
上面这些概念之间的关系就是: The temporary scope of an expression is the scope that is used for the temporary variable that holds the result of that expression when used in a place context。(摘自文献 3)
注意这里的三个关键词:temporary scope、temporary variable 和 place context
处于位置上下文(place context)的表达式就是位置表达式,它代表了一个内存位置(Paths)。这些表达式是局部变量、静态变量、解引用(*expr)表达式、数组索引表达式(expr[expr])、字段引用(expr.f)和括号内的位置表达式(parenthesized place expressions)
大概就是说,我们讲到生命周期(lifetime)就是总是从代码层面去分析对不对?去看是不是你变量的第一次声明和最后一次使用跨越了一个 block,但是实际上 Rust 做这个生命周期是为了检查内存的有效性的,你还可以从变量指向内存的位置和保证内存的有效性这两个角度来理解生命周期。(Thinking about lifetime as regions of memory, what can they——the reference point to?)