Featured image of post Rust学习

Rust学习

在网络安全的学习中越来越发现没有编程基础寸步难行,同时我也想要学习相关的程序开发,因为Rust功能强大,并且是系统语言,或许算比较适合我的语言?(但愿吧)

后记:家人们,不要学习Rust,这是我第 六次入门Rust

我主要是从以下的文章中学习Rust,但是发现每个教程都有不太面向初学者的部分,因此我做一下梳理,也方便我后面查缺补漏。

Rust 程序设计语言

Rust 程序设计语言 简体中文版

Rust语言圣经(Rust Course)

Rust语言中文版

Rust 参考手册 中文版

通过例子学 Rust 中文版

Rust 教程

Rust输出

我们将以菜鸟教程上的顺序来进行。

第一步,经典的Hello,world

Hello,World!

创建项目目录

这一步是每个Rust程序的开端,每一个伟大的项目都起源于此。

我们使用cargo来创建一个名为Hello_World的项目:

cargo new Hello_World

然后我们需要进入到我们新创建的Hello_World目录下,这将是我们经常用到的,

cd Hello_World

有时候发现程序无法编译?先看看是否进入了正确的项目目录下。

我们来看看这个项目的项目结构:

1
2
3
4
5
6
7
$ tree
.
├── .git
├── .gitignore
├── Cargo.toml
└── src
    └── main.rs

其中,Cargo.tomlcargo 特有的项目数据描述文件。它存储了项目的所有元配置信息,如果 Rust 开发者希望 Rust 项目能够按照期望的方式进行构建、测试和运行,那么,必须按照合理的方式构建 Cargo.toml 。我们可以理解为这里存储了这个项目中所有我们需要的依赖库,我们在这里告诉程序我们要导入哪些库。

_Cargo.toml_一般是这个样子:

1
2
3
4
5
6
7
8
// package 配置段落
[package] 
name = "world_hello"
version = "0.1.0"
edition = "2021"
// 定义项目依赖 
[dependencies]   
// 这里刚打开是空的,我们需要把我们要的库复制到这里  

main函数

接下来我们来看看 main.rs ,此文件是当前 Rust 工程的入口文件,每一个新建的Rust项目都会有这个文件。

我们来看看这个文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// 这是注释内容,将会被编译器忽略掉
// 可以单击那边的按钮 "Run" 来测试这段代码 ->
// 若想用键盘操作,可以使用快捷键 "Ctrl + Enter" 来运行

// 这段代码支持编辑,你可以自由地修改代码!
// 通过单击 "Reset" 按钮可以使代码恢复到初始状态 ->

// 这是主函数
fn main() {
    // 调用编译生成的可执行文件时,这里的语句将被运行。

    // 将文本打印到控制台
    println!("Hello World!");
}

这几行定义了一个名叫 main 的函数。main 函数是一个特殊的函数:在可执行的 Rust 程序中,它总是最先运行的代码。第一行代码声明了一个叫做 main 的函数,它没有参数也没有返回值。如果有参数的话,它们的名称应该出现在小括号 () 中。

函数体被包裹在 {} 中。Rust 要求所有函数体都要用花括号包裹起来。一般来说,将左花括号与函数声明置于同一行并以空格分隔,是良好的代码风格。

很简单吧,fn 是定义函数,main是函数名,被{}包裹起来的是函数体。

在函数体中,我们看到使用println!("Hello World!");输出了 Hello World!

这里有几个点需要注意一下,在Rust中 println! 调用了一个 Rust 宏(macro)。如果是调用函数,则应输入 println(没有!) 关于宏,我们后面再说,现在你只需记住,当看到符号 ! 的时候,就意味着调用的是宏而不是普通函数,并且宏并不总是遵循与函数相同的规则。

另外,这个语句以;结尾,Rust中的大多数语句都以 ; 结尾,但 ; 并不是简单的行与行之间的分割符,而是标致着一个语句的结束。在语句未结束时使用 ; 是错误的。

例如:

1
2
3
fn add_one(x: i32) ->i32 {
    x + 1
}  

这里会返回一个 i32 的值,但如果加了 ; 它会返回()

这里简单的提一嘴,并不是我们现在要讨论的核心,但这个小知识点还是要记住的。

现在我们让它跑起来:

在终端中,我们输入:

cargo run

就会得到Hello World!

编译与运行

通过上面那个例子,我们不难发现Rust的编译和运行是分开的,我们可以直接让它快速执行编译,也可以先编译然后再运行,不过总之都是要编译的,这也是系统语言和脚本语言的一大不同点。

我们使用:

cargo build

来编译我们我们的程序

然后使用:

cargo run

来让项目跑起来。

Cargo 还提供了一个名为 cargo check 的命令。该命令快速检查代码确保其可以编译,但并不产生可执行文件:

cargo check

cargo check 是我们在代码开发过程中最常用的命令,它的作用很简单:快速的检查一下代码能否编译通过。因此该命令速度会非常快,能节省大量的编译时间。

BTW, 以上的编译和运行都是在debug模式下进行的,在这种模式下,代码的编译速度会非常快,可是福兮祸所伏,运行速度就慢了. 原因是,在 debug 模式下,Rust 编译器不会做任何的优化,只为了尽快的编译完成,让你的开发流程更加顺畅。

如果想要高性能的代码,我们可以在命令后面加上 --release :

cargo run –release cargo build –release

[!NOTE]

rust自身是使用rustc进行编译的, rustc,rustup和cargo之间的关系可以理解为rustc是编译器,rustup是更新器,cargo是包管理器

Rust 基础语法

变量,基本类型,函数,注释和控制流,这些几乎是每种编程语言都具有的编程概念。

这些基础概念将存在于每个 Rust 程序中,及早学习它们将使你以最快的速度学习 Rust 的使用。

变量

首先必须说明,Rust 是强类型语言,但具有自动判断变量类型的能力。这很容易让人与弱类型语言产生混淆。

默认情况下,Rust 中的变量是不可变的,除非使用 mut 关键字声明为可变变量。

1
2
let a = 123;       // 不可变变量
let mut b = 10;  // 可变变量  

如果要声明变量,需要使用 let 关键字。例如:

1
let a = 123; 
Licensed under CC BY-NC-SA 4.0
Build by Oight
使用 Hugo 构建
主题 StackJimmy 设计