Skip to main content

Gatech CS3210 学习笔记 - lab0 part2

· 4 min read

即使文内从未明说,Rust By Example是为有c语言基础的人准备的,这在后面的章节愈发明显。同时在这部分章节总是漂浮着一个令人无法忽视的东西,所有权和生命周期,但这部分内容在后面的章节才细说。之前在使用rustlings的时候我就发现rustc可以在编译阶段实现单元测试,但看到十三章我才知道编译器能做的不仅如此,甚至还可以做基准测试。 这一篇记录第九章到第十三章的内容,这部分大多是与模块化编程有关的内容

学会了什么

  1. 定义函数的关键词是fn,声明返回值的关键词是->位于函数体前。给个例子fn foo(bar: i32) -> i32 {},和前文提到的代码块类似,函数体最后一行代码不加分号即视为返回值的表达式,在任意位置都可以通过return关键词返回。
  2. 通过impl关键词可以为结构体添加函数,即方法(method),方法可以通过&self&mut self参数获得对象上下文,方法通过::访问
  3. lambda表达式的语法比较特别,使用||包围参数表,函数体可以没有大括号{}。相对于函数来说,lambda表达式更加自由,能够自动获取环境中的变量。
  4. lambda表达式与其他语言类似,可以作为函数的参数和返回值出现。但一些高级用法涉及到了后面的章节,这里先跳过。
  5. rust中存在一种类型叫做空类型,它的特点是没有任何可能的值,无法实例化。返回值为空类型的函数永远不会返回,文中指出一个可能会用到这个特性的地方是与网络请求有关的函数。
  6. 模块(module)类似于cpp的命名空间,模块中可以存放任何内容,默认私有,通过pub()关键词可以声明成员公有及公有范围,成员通过self访问本模块成员,通过super访问外部模块成员。在外部通过::访问模块内的公有成员,mod关键词可以绑定其他文件的模块,use关键词可以绑定模块成员到上下文。
  7. rust将编译单元称为crate,crate是经过预处理后生成的,与源代码的结构不完全相同
  8. cargo是rust官方的中心化包管理器, crates.io 是平台,和其他包管理器一样支持项目管理、依赖管理、自定义脚本,还支持单元测试。
  9. attribute类似于c语言的预处理器命令,但不同的是在rust中这部分由编译器处理,语法为#[]#![],功能包括但不限于提供crate元信息、配置编译选项、条件编译、标记单元测试、标记基准测试。