Rust hello world

Rust 编程入门

本地文档

1
rustup doc

更新到最新版本

1
rustup update

Rust 程序解剖

1
2
3
fn main(){
println!("Hello World");
}

定义函数:fn main(){}

  • 没有参数,没有返回值

main 函数是每个 Rust 可执行程序最先运行的代码;

打印文本: println!(“Hello World”);

  • Rust 的缩进是 4 个空格,而不是 tab
  • println! 是一个 Rust macro(宏)
    • 如果是函数的话,没有 !
  • 代码以 ; 结尾

Rustc 编译与运行

  • 运行 Rust 程序前必须先编译,命令: rustc 源文件名

    • rustc 中的 c => compiler 编译器,的意思;
    • rustc main.rs
  • 编译成功后,会生成一个二进制文件

    • Windows 下为 源文件名.exe;Linux/Mac 下为 源文件名

    • windows 上还会生成一个 .pdb文件,里面包含调试信息

  • Rust 是 ahead-of-time 即预先编译的语言

    • 可以先编译程序,然后把可执行文件交给别人运行(无需安装 Rust)
  • rustc 只适合简单的 Rust 程序,项目使用 cargo 编译工具来编译

    • 这里类似 javac 与 java 的关系,单个文件使用 javac 来编译,项目使用 maven/gradle/ant 等编译工具

Cargo

  • cargo 是 Rust 的构建工具(构建系统和包管理工具)
    • 构建代码,下载依赖库,构建这些库。。。
    • 类似 java 的 maven
  • 安装 Rust 的时候会安装 cargo
    • cargo --version

使用 cargo 创建项目

  • 创建项目: cargo new <项目名>
    • cargo new hello_cargo
    • 会创建一个新的目录(项目名目录)
      • Cargo.toml
      • src 目录
        • main.rs
      • 初始化了一个新的 Git 仓库, .gitignore
        • 可以使用其他的 vcs 或者不适用 vcs:cargo new 的时候使用 –vcs 这个flag

Cargo.toml

1
2
3
4
5
6
7
8
[package]
name = "hello-cargo"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
  • TOML (Tom’s Obvious, Minimal Language) 格式,是 Cargo 配置文件的格式
    • 类似与 YAML 和 JSON
  • [package] ,是一个区域标题(section),表示下方内容是用来配置包(package)的,cargo 编译程序需要的配置
    • name,项目名
    • version,项目版本
    • edition,使用的 Rust 版本
    • …,其他内容会根据系统自动提取,例如,authors 作者
  • [dependencies],它会列出项目的依赖项
  • 还可以增加其他片段/区域(section)

Cargo.lock 文件确保构建是可重现的

Cargo 通过 Cargo.lock 文件来确保任何人在任何时候重新构建代码,都会生成相同的结果。

Cargo 只会使用你指定的依赖版本,除非重新修改配置文件中的依赖版本。

在第一次构建项目时,Cargo 计算出所有符合要求的依赖版本,并写入 Cargo.lock 文件。当之后构建项目时,Cargo 会发现 Cargo.lock 已存在并使用其中指定的版本,而不是再次计算所有的版本。

更新 crate 到一个新版本
1
cargo update

这个命令会忽略 Cargo.lock 文件,并计算出所有符合 Cargo.toml 声明的最新版本。如果成功了,Cargo 会把这些版本写入 Cargo.lock 文件。

构建并运行 Cargo 项目

Cargo 的命令是操作系统无关的,不管使用什么操作系统,命令一样。

  • cargo build编译并生成可执行文件。
    • 首次运行时,会在项目根目录创建一个 Cargo.lock文件,记录项目以来的实际版本(永远不需要碰该文件,让 Cargo 处理就行)。
    • 在项目根目录下生成 target/debug/项目可执行文件,可以直接运行
  • cargo check ,可以快速检查代码,确保其可以编译,但不产生可执行文件。
    • 适用于编写代码时定期运行 cargo check ,确保它们可以编译,加速开发。
  • cargo run ,通过一条命令,编译并运行生成的可执行文件。
    • 相当于 cargo build + 运行文件
  • cargo build --release ,发布构建
    • 可以优化编译项目。
      • 有些优化可以让 Rust 代码运行的更快。不过启用这些优化也需要消耗更长的编译时间。所以会有两种不同的编译方式
      • 一种用来快速重新构建;
      • 一种是为用户构建最终程序,不会经常重新构建,并且希望程序运行越快越好。
    • 会在target/release 目录下生成可执行文件。

2. 猜数小游戏

1
2
3
4
5
6
7
8
9
10
11
// 导入非 prelude 模块中的内容,需要使用 use 关键字来导入
use std::io;

fn main() { // fn 用来声明函数
println!("Guess the number!");
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess).expect("Failed to read line");

println!("You guessed: {}", guess);
}

获取用户输入并打印结果作为输出,需要使用 io库,io库来自标准库(也被称为std):

1
use std::io;
  • prelude 是 Rust 的预导入模块,有少量类型可以直接使用。如果需要的类型不在 prelude 中,就必须使用 use 语句显示的将其引入作用域中。
  • std::io 库是 Rust 的标准库之一。
1
fn main() {}
  • fn 语法用来声明一个函数
1
let mut guess = String::new();
  • let 语句用来创建变量(variable)。

  • 默认 Rust 的变量是不可变的。(这个会在后面讨论,变量与可变性)。需要在变量名前使用 mut 关键字使其成为可变边变量:

    1
    2
    let apples = 5; // immutable
    let mut bananas = 5; // mutable
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
遇到的问题
use std::io;

fn main() {
println!("Guess the number!");
println!("Please input your guess.");
let mut guess = String::new();
let mut apples = 5; // line 8,9 两行,为什么 apples 重新赋值后,编译运行时,第8行还会有warning 告警?后面学习时看看能不能解答这个疑惑?
apples = 6;
println!("{}",apples);
io::stdin().read_line(&mut guess).expect("Failed to read line");

println!("You guessed: {}", guess);
}

// 运行告警如下:
PS C:\Tableware\codes\rust\guessing_game> cargo run
Compiling guessing_game v0.1.0 (C:\Tableware\codes\rust\guessing_game)
warning: value assigned to `apples` is never read
--> src\main.rs:7:13
|
7 | let mut apples = 5;
| ^^^^^^
|
= note: `#[warn(unused_assignments)]` on by default
= help: maybe it is overwritten before being read?

warning: `guessing_game` (bin "guessing_game") generated 1 warning
Finished dev [unoptimized + debuginfo] target(s) in 0.68s
Running `target\debug\guessing_game.exe`
Guess the number!
Please input your guess.
6
12
You guessed: 12
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2023 ligongzhao
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信