跳转至

Rust 基础


命令

# 编译
rustc 文件.rs

rustup update 更新 更新依赖

rustc 文件.rs 生成二进制可执行文件

cargo new 项目名 创建项目

cargo buile 构建项目 生成二进制可执行文件

cargo buile --release 生成环境

cargo check 检查项目是否可以编译

cargo doc --open 说明文档

Some 还没有搞明白


基本

# 入口
fn main (){
    println!("Holle Word!")
}
# 定义函数
fn 函数名 () {
    //
}

变量定义

let 变量名 = ;
let 变量名:数据类型 = ;

// 可变变量 
let mut 变量名 = ;

// 常量 字母全部大写 块级作用域 不可变 类型必须声明
const 变量名:数据类型 = ;

// 静态变量 字母全部大写 生命周期是整个程序的生命周期 
static 变量名 = ;

命名空间

命名空间 作用域 内声明的变量与获取的变量是同一个变量, 命名空间结束后命名空间内的变量自动销毁

{
    // 代码块
}

关联函数

关联函数经常被用作返回一个结构体新实例的构造函数

impl 结构体名 {
    fn 关联函数名(size: u32) -> 结构体名 {
        结构体名 {
            width: size,
            height: size,
        }
    }
}

impl Rectangle {
    fn square(size: u32) -> Rectangle {
        Rectangle {
            width: size,
            height: size,
        }
    }
}

调用

// 返回一个对象
let 名称 = 结构体名::关联函数名(参数)

assert_eq!(result, 100); 判断两个表达式的值是否相同 如果不相同将停止执行


语法

输出

# 输出
println!("Holle Word!");
println!("Holle Word!{}", 变量名);
println!("{0}, this is {1}. {1}, this is {0}", "Alice", "Bob");
println!("{subject} {verb} {object}",object="the lazy dog",subject="the quick brown fox",verb="jumps over");

println!("{:?}", peter);
println!("{:#?}", peter);

for

遍历

for i in 迭代数据{
    // 代码
}

if

if number == 0 {
    // 代码块
} else if number == 0 {
    // 代码块
} else {
    // 代码块
}

loop

loop {
    if 条件 {
        break;
    }
}
'名称: loop {
    if 条件 {
        break '名称;
    }
}

break 结束循环

break 表达式 结束循环并返回值

continue 结束本次循环 进入下次循环


while

while 条件 {
    // 代码块
}

match

控制流

match  {
    模式1 => 表达式1,
    模式2 => 表达式2,
    _ => 默认表达式, // 可选的
}

match number {
    1 => println!("One"),
    2 => println!("Two"),
    3 => println!("Three"),
    _ => println!("Other number"),  // 不绑定值
    other => other,  // 通配分支  绑定值
}

fn plus_one(x: Option<i32>) -> Option<i32> {
    match x {
        None => None,
        Some(i) => Some(i + 1),
    }
}

枚举与match

match coin {
    Coin::Penny => 1,
    Coin::Nickel => 5,
    Coin::Dime => 10,
    Coin::Quarter(state) => {
            println!("State quarter from {:?}!", state);
            25
        }
}

match 枚举对象 {
    枚举结构体::枚举字段 => 1,
    Coin::Nickel => 5,
    Coin::Dime => 10,
    Coin::Quarter(state) => {
        println!("State quarter from {:?}!", state);
        25
    }
}

函数

返回值是最后一个表达式的值

fn add(x: i32, y: i32) -> i32{
    x + y
}

Result

确保处理确保异常

enum Result<T, E> {
    Ok(T),
    Err(E),
}

T 代表成功, E 代表失败


错误处理

let f = File::open("hello.txt");

let f = match f {
    Ok(file) => file,
    Err(error) => {
        panic!("Problem opening the file: {:?}", error)
    },
};

panic!

不可恢复错误

打印错误信息 到标准错误信息, 程序出现错误时会自动调用panic!

// 手动触发panic!
panic!("错误信息")

泛型

struct Point<T> {
    x: T,
    y: T,
}

struct Point<T, U> {
    x: T,
    y: U,
}

impl<T> Point<T> {
    fn x(&self) -> &T {
        &self.x
    }
}

trait

// 定义
pub trait Summary {
    fn summarize(&self) -> String;

    // 不需要被其他 impl 定义 可以直接使用
    fn summarize(&self) -> String {
        format!("(Read more from {}...)", self.summarize_author())
    }
}

// 定义
pub struct NewsArticle {
    pub headline: String,
    pub location: String,
    pub author: String,
    pub content: String,
}

// 使用了trait的Summary后必须实现里面的函数
impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!("{}, by {} ({})", self.headline, self.author, self.location)
    }
}