Rust是一种快速、高并发、安全且具有授权性的系统级编程语言。
Rust借用了C和C++的语法,它不允许空指针和悬挂指针,二者是C和C++中系统崩溃、内存泄露和不安全代码的根源。
Rust做到了内存安全而无需.NET和Java编程语言中实现自动垃圾收集器的开销,这是通过所有权/借用机制、生命周期、以及类型系统来达到的。
Rust 使用实现(implementation)、特征(trait)和结构化类型(structured type)而不是类(class)。
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后面的值跟某一个分支匹配到时,就会执行该分支对应的代码
编译命令:rustc 源文件名
如rustc main.rs
运行命令:- Windows:.\main.exe
- Linux/mac:./main
rustc只适合简单的Rust程序,复杂程序建议用Cargo
Cargo是Rust的构建系统和包管理工具
使用Cargo创建项目 cargo new hello_cargo
项目名称:hello_cargo
会创建一个新的目录hello_cargo
Cargo.toml //Cargo的配置格式
//[package]是一个区域标题,表示下方内容是用来配置包(package)的相关信息
//[dependencies]是另一个区域的开始,会列出项目的依赖项
//在Rust里面,代码的包称为crate
src目录 //源代码都应在src目录下
初始化一个新的git仓库
如果创建项目时没有使用cargo,也可以把项目转化为使用cargo:
构建Cargo项目 cargo build
会 创建可执行文件 + 运行可执行文件
第一次运行cargo build
会在顶层目录生成cargo.lock
文件,该文件负责追踪项目依赖的精确版本,不需要手动修改该文件
构建和运行cargo项目 cargo run
编译代码 + 执行结果
检查代码 cargo check
检查代码,确保能通过编译,但是不产生任何可执行文件
cargo check
比cargo build
快得多,编写代码时可以反复使用cargo check
来检查代码,提高效率
为发布构建 cargo build --release
编译时会优化,代码会运行更快,但编译时间更长
会在target/release
而不是target/debug
生成可执行文件
这个Rust教学视频真的干货满满,没什么废话,是我看过最喜欢的一个教学视频
以及Rust语言感觉好强大,很喜欢他的安全性