Rust学习入门(1):Rust的认识+从简单的Rust程序学习Rust的基本操作+Rust的编译与运行+Cargo的基本操作

文章目录

    • Rust学习
      • 认识
      • 简单的Rust程序
      • Rust程序的编译与运行
        • Cargo
      • 参考链接
      • 碎碎念

Rust学习

认识

  • Rust是一种快速、高并发、安全且具有授权性的系统级编程语言。

  • Rust借用了C和C++的语法,它不允许空指针和悬挂指针,二者是C和C++中系统崩溃、内存泄露和不安全代码的根源。

  • Rust做到了内存安全而无需.NET和Java编程语言中实现自动垃圾收集器的开销,这是通过所有权/借用机制、生命周期、以及类型系统来达到的。

  • Rust 使用实现(implementation)、特征(trait)和结构化类型(structured type)而不是类(class)。

简单的Rust程序

fn main() {
    println!("Hello, world!");
}

fn表示要建立一个函数

fn <函数名> (<参数>)<函数体>

rust不在乎函数在何处定义,只需定义即可

Rust 中定义函数如果需要具备参数必须声明参数名称和类型

fn main(){
	another_function(5,6);
}

fn another_function(x:i32,y:i32){
	println!("x :{}",x);
}

猜猜看游戏

use std::io;
use std::cmp::Ordering;
use rand::Rng;

fn main() {
    println!("Guess the number!");

    let secret_number = rand::thread_rng().gen_range(1, 101);

    loop {
        println!("Please input your guess.");

        let mut guess = String::new();

        io::stdin().read_line(&mut guess)
            .expect("Failed to read line");

        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };

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

        match guess.cmp(&secret_number) {
            Ordering::Less => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal => {
                println!("You win!");
                break;
            }
        }
    }
}

use std::io;相当于#include

std是一个标准库

let用于声明一个变量,这个变量默认为不可变的

mut修饰的变量表示可变

let a = 1;
a = 2;//报错

let mut b = 2;
b = 3;//不报错

io::stdin().read_line(&mut guess) .expect("Failed to read line");&表示方法的参数时按引用进行传递的,引用在rust里面也是默认不可变的;如果删去.expect("Failed to read line")就会发出warning,表示该语句未对潜在错误进行处理,体现rust的安全性。

println!("You guessed: {}", guess);{}代表一个占位符,相当于%

let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };

在rust里面允许使用同名新变量来隐藏原来同名的旧变量,经常用在需要类型转化的时候

.trim()会去掉两边的空白,如Tab\n

.parse()会把字符串解析成某种数据类型,需要指定类型

guess: u32是显示声明类型

loop{}表示循环执行{}内容

//1
let guess: u32 = match guess.trim().parse().expect("Please type a number!");
//2
let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };

对比以上两组代码,在第一组代码中,当键入非数字字符时,程序会因无法将其转化为u32类型引起崩溃,自动退出,不具有良好的健壮性;改为第二组代码,parse返回的result是一个枚举类型,针对枚举类型可以使用match表达式来替换,如果返回ok就把num赋给guess,如果返回Err就执行continue操作,其中Err(_)表示不关心Err返回的错误信息是什么,只要是Err就执行continue

match guess.cmp(&secret_number) {
            Ordering::Less => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal => {
                println!("You win!");
                break;
            }
        }

match是由多个分支组成的,match后面的值跟某一个分支匹配到时,就会执行该分支对应的代码

Rust程序的编译与运行

编译命令:rustc 源文件名rustc main.rs

运行命令:- Windows:.\main.exe - Linux/mac:./main

rustc只适合简单的Rust程序,复杂程序建议用Cargo

Cargo

Cargo是Rust的构建系统和包管理工具

使用Cargo创建项目 cargo new hello_cargo

  • 项目名称:hello_cargo

  • 会创建一个新的目录hello_cargo

    • Cargo.toml //Cargo的配置格式

                //[package]是一个区域标题,表示下方内容是用来配置包(package)的相关信息

                //[dependencies]是另一个区域的开始,会列出项目的依赖项

                //在Rust里面,代码的包称为crate

    • src目录 //源代码都应在src目录下

      • main.rs
    • 初始化一个新的git仓库

如果创建项目时没有使用cargo,也可以把项目转化为使用cargo:

  1. 把源代码文件移动到src下
  2. 创建Cargo.toml并填写相应的配置

构建Cargo项目 cargo build

会 创建可执行文件 + 运行可执行文件

第一次运行cargo build会在顶层目录生成cargo.lock文件,该文件负责追踪项目依赖的精确版本,不需要手动修改该文件

构建和运行cargo项目 cargo run

编译代码 + 执行结果

检查代码 cargo check

检查代码,确保能通过编译,但是不产生任何可执行文件

cargo checkcargo build快得多,编写代码时可以反复使用cargo check来检查代码,提高效率

为发布构建 cargo build --release

编译时会优化,代码会运行更快,但编译时间更长

会在target/release而不是target/debug生成可执行文件

参考链接

  1. Rust编程语言入门教程(Rust语言/Rust权威指南配套)【已完结】_哔哩哔哩_bilibili
  2. Rust程序设计语言简体中文
  3. 五分钟入门rust语言_网络安全研发随想的博客-CSDN博客_rust语言

碎碎念

这个Rust教学视频真的干货满满,没什么废话,是我看过最喜欢的一个教学视频
以及Rust语言感觉好强大,很喜欢他的安全性

你可能感兴趣的:(Rust,rust,学习,开发语言)