0%

Rust学习笔记

1、 Rust允许在同一个代码块中声明一个与之前已声明变量同名的新变量,新变量会遮蔽之前的变量,即无法再去访问前一个同名的变量,这样就实现了变量遮蔽。
常量不能遮蔽,不能重复定义。

1
2
3
4
5
6
7
8
fn main() {
let x = 3;
let x = x + 2;
let x = x * 2;
println!("x: {}", x);
let x = "Hello, Rust!";
println!("x: {}", x);
}

2、 复制

  • 对于元组类型,如果每个元素的类型都实现了Copy trait,那么该元组类型数据支持浅复制。
  • 结构体和枚举有些特殊,即使所有字段的类型都实现了Copy trait,也不支持浅复制。

3、 高效处理Result<T, E>

  • 如果Result的值是Ok,unwrap方法会返回Ok中的值。如果Result的值是Err,unwrap方法会自动做Panic处理并输出默认的错误消息。
  • expect方法不仅具备unwrap方法的功能,还允许自定义错误信息,这样更易于追踪导致程序错误的原因。
    1
    2
    3
    4
    5
    use std::fs::File;

    fn main() {
    let f = File::open("hello.txt").expect("Failed to open hello.txt");
    }
  • 如果Result的值是Ok,unwrap_or_else会返回Ok中的值。如果Result的值是Err,unwrap_or_else可以执行一个闭包。
  • “?”操作符可以用于返回值类型为Result的函数中,如果出现错误,“?”操作符会提前返回整个函数并将Err值传播给调用者。
    1
    2
    3
    4
    5
    fn read_from_file() -> Result<String, io::Error> {
    let mut s = String::new();
    File::open("hello.txt")?.read_to_string(&mut s)?;
    Ok(s)
    }

4、 迭代器类型
| 迭代器 | 所有权借用 | 创建方法 | 迭代器元素类型 |
| :—-: | :—-: | :—-: | —— |
| IntoIter | 转移所有权 | into_iter | T |
| Iter | 不可变借用 | iter | &T |
| IterMut | 可变借用 | iter_mut | &mut T |

总结

曾在去年看过一遍 Rust 的语法,当时 Rust 这种新颖的借用-生命周期设计给我了很深的印象。

后面一直没机会使用后面基本全忘了,这次又跟着学了一遍,又弥补了一些细节上的问题,感觉收获很多。

期待这次训练营的实操,Rust 会给我一个怎样的编程体验。

第一阶段学习感受

完成了rCore训练营的第一部分——rust基础编程,有以下收获

  • 感受了rust在开发程序时的安全性
  • 增进了对函数式编程的了解
  • 获得了一些与rust编译器斗争的经验:)
  • 对链表有了更加深刻的理解
  • 获得了一些关于引用和借用的知识

2024开源操作系统训练营第一阶段总结报告

寒假期间即了解了操作系统项目rCore,并跟着做了rCore的一些练习,相关项目可以参考KamijoToma/rCoreOS

在这期间通过rCore学习了Rust这门语言。Rust语言的威名我早已听闻,大家都说“学习Rust可以改变个人的一些编程习惯”,在我真正学习到Rust之后,对这句话有了更形象和深刻的理解。

下面我简单列出我的感想:

  1. 对编程语言的设计有了更深的理解

在学习其他语言和使用的过程中,我经常遇到如何在一个函数中返回异常的问题。高级语言,例如Java、C++,给出的解决方案是通过一个特殊的路径——异常,来返回这些错误。
然而,这些异于正常控制流的异常返回会令编译器的工作更加繁重,打乱执行流也意味着会造成额外的性能损失和更加复杂的汇编设计,也是基于此原因Google不建议在C++中使用异常。

另一门语言,Java,也使用异常。在学习Java异常的时候,我了解了Google的Optional库。它取代或部分取代了Java中异常的功能,通过将返回值包裹在一个Optional类中,来指示函数是否正确的处理了这个值。
到这里可能就有些熟悉了,这正是Rust中Option和Result枚举的设计思路。通过将异常和返回值包裹在一个枚举中作为函数的真正返回值,我们将异常的控制流非异常化,减少了编译器设计难度和性能损失。
同理,Rust中对各种trait进行组合也是我认为很优秀的设计思路。这些设计手法让我对编程语言设计的问题理解的更加深刻。

  1. 改进了编码习惯

提到Rust的特点,绕不开的关键词就是“所有权”。作为一门系统级语言,Rust当然不使用gc来自动管理内存,它也不完全需要程序员手动管理内存。事实上,它强迫程序员按照一定的规则来申请和释放内存。
在这里我不再提所有权的细节,而是想说,通过这种强迫的方式,我改掉了很多之前随意申请释放内存的情况。即使编写C程序,我也谨依Rust曾经教过我的管理方法去管理内存。

Rust是一门简洁有力但又有深度的编程语言,难怪有很多人为Rust所狂热。道路是曲折的,前途是光明的,我希望能同255DoesNotExist和TrisuyaN、reecho等同学一起,完整的学完这个夏令营~

我是工作多年的IT从业者,用很多语言写过很多有大有小的程序。我听说过rust但始终没抽出时间来学,这次通过练习,感觉到了它的安全性和可靠性,以及良好的表现。

我觉得rust是非常有前景的系统编程语言。感谢老师和同学们的分享。大家一起加油!

第一阶段总结

最开始是通过朋友的分享知道了rust训练营,在此之前也从来没听过rust语言,只学习过c和python。编程能力实在薄弱。学起rust确实很吃力。但是我通过看圣经和其他参考资料,也慢慢了解了rust的基本用法,感觉rust的很多特性很妙,很厉害。最终在gpt的帮助下,也还是刷完了Rustlings。感谢这个训练营提供的机会,让我了解到rust。

第一阶段:
之前看到过rcore的宣传,不过当时看到的时候已经晚了,rust还没学会就结束了,不过当时做了几十道rustlings,留了点基础。
正好这学期学校开了rust课,也多了点时间,就来做了一下。和官网的rustlings不同,这里加的10道数据结构题感觉还是非常不错的。
本人比较懒,不知甚解地写完了rustlings,但是理解和实践能力还是比较不足,这十道题正好综合了之前的知识,写完还是很有收获的,虽然我用了GPT(
anyways,希望后面的第二第三阶段也能顺利完成,第一阶段还是比较简单的。rust还挺难的,希望自己坚持下来
第二阶段:
总的来说是很让我很惊讶的实验。之前以为是别的实验课那样,在给出的一堆乱七八糟的东西上实现os的相关功能,但是rcore真的基本上从0开始讲解了如何一步步构建一个基本的操作系统,力求大部分细节都照顾到。属实是刷新了我在学校操作系统课和实验里学到的无比浅薄、零散的知识。
唯一不满意的地方是我自己hh,由于时间不太充裕,很多细节其实并没有照顾到,虽然基本的实验是能凑出来,但是明显感觉到对rcore的认识还是不够的,而且还是用的print来debug hhh。

anyway,虽然实验写完了,但是这套代码还玩不起来,不能做到自己随心所欲的更改。准备之后再好好看看问答题怎么写。

第一阶段 Rustlings 总结

这是我第一次接触rust,这一个月基本上用于学习rust的基础知识,主要是通过rustlings这个项目来学习,这个项目是一个非常好的项目,通过这个项目我学习到了很多rust的基础知识,比如rust的基本语法,rust的数据类型,rust的所有权系统,rust的模块系统等等,这些知识对我来说都是非常重要的,我也通过这个项目学习到了一些rust的编程技巧,比如如何使用match表达式,如何使用闭包等等,这些技巧对我来说也是非常重要的,总的来说,这一个月的学习让我对rust有了一个初步的了解.
rustlings让我第一次看到还可以这么学一门语言,通过一些小的练习来学习一门语言,这种学习方式非常的有趣,我也通过这个项目学到了一些学习方法,比如如何通过阅读错误信息来找到错误的原因,如何通过阅读文档来学习一门语言等等,这些方法对我来说也是非常重要的。
希望我能坚持下来接下来的学习!!!

总结与感悟

自去年在操作系统训练营首次接触rust以来,这是第二次系统地再次过了一遍rust的知识,这是我学习的第一门类函数式编程语言,对于基本的语法掌握的还算可以,但是许多复杂的部分让我学起来感到痛苦。

首先是类型系统,作为强类型语言,对类型的要求很苛刻,每次涉及到复杂类型都要和编译器搏斗,为了安全牺牲掉了一些便捷是可以理解的,但是复杂的类型系统绝对会让初学者红温,这种感受在我做到101题,链表合并的时候达到了顶峰:)

其次是迭代器,迭代器使用起来非常方便,但是理解他的用法是有一些困难的,并且有一些需要记忆的内容,要特别注意。

这次加了十道算法题,感觉这种设计非常好,帮助我把前面的一些知识综合了起来,希望rust生态、os社区越来越好。

背景

在加入此次训练营之前,我正在学习MIT的xv6操作系统(RV汇编,C语言),一直听闻清华的用Rust写的OS–rCore–,而且也是基于xv6,RV版的。本打算结束了xv6再了解的,但是恰巧发现了春夏季训练营的报名机会而且时间也算合适,觉得如果想了解Rust和rCore就不要再拖延了,于是下定决心报名并开始正式地学习Rust语言。

心得

早已听闻Rust在内存安全方面全面的保护,以及Rust学习曲线之陡峭,在正式开始前就给自己做足了心理建设。

我并没有过严格的C/C++编程体验,在CS61C短暂的接触过C语言,在CMU-15445短暂的接触过C++,所以可能我并无法感受到相比C/C++,Rust为编程者带来的“思想解放”。但是在MIT xv6学习过程中,我确实深刻地体会到C语言“天使与魔鬼”的含义,C语言让编程者随心所欲地调用系统资源,但是编程者就要为(潜在的、无数的、折磨人的)“segmentation fault”,“undefined behavior”们负责。

在Rust学习过程中,我也切身体会到了“编译器教我做人”的感觉,意识到这并不是一句玩笑话。初期面对一堆报错,我会苦恼一个编译器怎么这也管那也管,我就是想把这个值赋给这个变量,你信我就好了这没问题……但是我逐渐意识到Rust语言的安全性也正因此得以体现,它让程序编写的初期就足够安全,避免了许多运行时的bug,也许增加了编程者的心智负担,但是确实为程序的运行增添了值得这样负担的保障和性能。这更加深了我作为编程者的“责任感”:你要对自己写下的程序负责,而不是随意暴露问题。

但是我作为Rust初学者,必须承认仍然对它知之甚少。我仍然无法感觉到为什么Rust作为系统编程语言,这也许是因为我把能对硬件资源肆意调用的权力当作了“一门系统编程语言”的特点。至此我觉得应该要对系统编程、C语言、Rust语言都要重新进行思考。

心得的最后,我想这样简短概况一下这两个多星期的Rust入门带给我的感受:Rust是一门要用心学的语言,不是一门顺便就学了的语言,如果无法做到反复体会咂摸Rust的思想,几乎无法用Rust做任何事。

目标

希望在未来rCore阶段的学习中,加深对操作系统,xv6,Rust语言,C语言的理解,同时对RV汇编再熟悉一下,上一次接触RV汇编以及是7个多月前61C的project了。