Rust 是一門現代系統編程語言,自2015年正式發佈以來,以其卓越的內存安全特性和高性能表現迅速獲得了開發者的青睞。
最近也在朋友的推薦下進行了解和學習,本文將全面介紹 Rust 的基礎知識、以及瞭解下常見的應用場景和開發工具。

目錄

  • 引言:Rust語言概述
  • 基礎語法
  • 變量與數據類型
  • 函數與控制流
  • 核心概念:所有權與生命週期
  • 所有權規則
  • 借用與引用
  • 生命週期註解
  • Rust應用場景
  • 系統編程
  • Web 開發
  • 網絡服務
  • 命令行工具
  • 遊戲開發
  • 開發工具與環境配置
  • 安裝 Rust
  • Cargo 使用指南
  • IDE 與調試工具
  • 總結
  • 文章推薦

引言:Rust語言概述

Rust 由 Mozilla 研究院於2006年啓動開發,旨在創建一門既能提供 C++ 級別性能,又能保證內存安全的系統編程語言。其核心設計理念圍繞"零成本抽象"和"內存安全 without 垃圾回收"展開。
Rust核心特性

  1. 內存安全:通過獨特的所有權系統在編譯時防止內存錯誤
  2. 併發安全:所有權系統和類型系統共同保障線程安全
  3. 高性能:無運行時和垃圾回收,性能可與 C/C++ 媲美
  4. 零成本抽象:高級語言特性不會帶來運行時開銷

Rust與其他語言的對比

【Rust】系統編程語言的核心語法以及常見應用場景淺談:系統、Web、網絡、命令行_Rust

基礎語法

變量與數據類型

變量和可變性

fn main() {
    // 默認不可變
    let x = 5;
    // x = 6; // 這會導致編譯錯誤
    
    // 使用 mut 關鍵字聲明可變變量
    let mut y = 10;
    y = 15; // 這是允許的
    
    // 常量
    const MAX_POINTS: u32 = 100_000;
    
    // 隱藏(shadowing)
    let spaces = "   ";
    let spaces = spaces.len(); // 允許重新綁定到不同類型的值
}

如果直接給let x進行二次賦值,那麼會提示如下報錯:

【Rust】系統編程語言的核心語法以及常見應用場景淺談:系統、Web、網絡、命令行_#rust_02


可變性正確設置,使用關鍵詞mut,如下:

fn main() {
    // 使用 mut 關鍵字聲明可變變量
    let mut y = 10;
    y = 15; // 這是允許的

    println!("y的值二次賦值後={}",y)
}

【Rust】系統編程語言的核心語法以及常見應用場景淺談:系統、Web、網絡、命令行_Rust_03


數據類型

Rust 是靜態類型語言,在編譯時必須知道所有變量的類型。

標量類型

fn scalar_types() {
    // 整數類型
    let decimal = 98_222;
    let hex = 0xff;
    let byte = b'A';
    
    // 浮點類型
    let x = 2.0; // f64
    let y: f32 = 3.0; // f32
    
    // 布爾類型
    let t = true;
    let f: bool = false;
    
    // 字符類型
    let c = 'z';
    let emoji = '😊';
}

複合類型

fn compound_types() {
    // 元組
    let tup: (i32, f64, u8) = (500, 6.4, 1);
    let (x, y, z) = tup; // 解構
    let five_hundred = tup.0;
    
    // 數組
    let a = [1, 2, 3, 4, 5];
    let first = a[0];
    let months = ["January", "February", "March"];
}

函數與控制流

函數

// 函數定義
fn add(x: i32, y: i32) -> i32 {
    x + y  // 注意沒有分號,這是表達式
}

fn main() {
    let result = add(5, 3);
    println!("5 + 3 = {}", result);
    
    // 函數指針
    let func: fn(i32, i32) -> i32 = add;
    println!("通過函數指針調用: {}", func(2, 3));
}

【Rust】系統編程語言的核心語法以及常見應用場景淺談:系統、Web、網絡、命令行_Web_04


控制流

fn main() {
    control_flow()
}

fn control_flow() {
    let number = 6;
    
    // if 表達式
    if number % 4 == 0 {
        println!("number is divisible by 4");
    } else if number % 3 == 0 {
        println!("number is divisible by 3");
    } else {
        println!("number is not divisible by 4 or 3");
    }
    
    // 在 let 語句中使用 if
    let condition = true;
    let number = if condition { 5 } else { 6 };
    
    // 循環
    let mut counter = 0;
    let result = loop {
        counter += 1;
        if counter == 10 {
            break counter * 2;
        }
    };
    
    // while 循環
    let mut number = 3;
    while number != 0 {
        println!("{}!", number);
        number -= 1;
    }
    
    // for 循環遍歷集合
    let a = [10, 20, 30, 40, 50];
    for element in a.iter() {
        println!("the value is: {}", element);
    }
}

【Rust】系統編程語言的核心語法以及常見應用場景淺談:系統、Web、網絡、命令行_Rust_05

核心概念:所有權與生命週期

所有權規則

  1. Rust 中的每一個值都有一個被稱為其所有者的變量
  2. 值在任一時刻有且只有一個所有者
  3. 當所有者離開作用域,這個值將被丟棄

移動(Move)語義

fn main() {
    ownership_demo()
}

fn ownership_demo() {
    let s1 = String::from("hello");
    let s2 = s1; // s1 的所有權移動到 s2
    
    // println!("{}", s1); // 錯誤!s1 不再有效
    
    // 克隆(深拷貝)
    let s3 = s2.clone();
    println!("s2 = {}, s3 = {}", s2, s3);
}

【Rust】系統編程語言的核心語法以及常見應用場景淺談:系統、Web、網絡、命令行_Web_06

借用與引用

借用(Borrowing)

fn borrowing_demo() {
    let s1 = String::from("hello");
    
    // 不可變借用
    let len = calculate_length(&s1);
    println!("The length of '{}' is {}.", s1, len);
    
    // 可變借用
    let mut s2 = String::from("hello");
    change(&mut s2);
    println!("After change: {}", s2);
}

fn calculate_length(s: &String) -> usize {
    s.len()
}

fn change(s: &mut String) {
    s.push_str(", world");
}

【Rust】系統編程語言的核心語法以及常見應用場景淺談:系統、Web、網絡、命令行_Rust_07

生命週期註解

生命週期

fn main() {
    borrowing_demo()
}

fn lifetime_demo() {
    let string1 = String::from("long string is long");
    let result;
    {
        let string2 = String::from("xyz");
        result = longest(string1.as_str(), string2.as_str());
        println!("The longest string is {}", result);
    }
    // 這裏不能再使用 result,因為 string2 已經離開作用域
}

// 生命週期註解
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

Rust應用場景

系統編程

Rust 非常適合操作系統、設備驅動、嵌入式系統等底層開發:

// 簡單的內存分配器示例
use std::alloc::{GlobalAlloc, Layout, System};

struct MyAllocator;

unsafe impl GlobalAlloc for MyAllocator {
    unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
        System.alloc(layout)
    }
    
    unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
        System.dealloc(ptr, layout)
    }
}

#[global_allocator]
static GLOBAL: MyAllocator = MyAllocator;

Web 開發

使用 Rust 構建高性能 Web 後端:

// 使用 Actix-web 框架的簡單示例
use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder};

#[get("/")]
async fn hello() -> impl Responder {
    HttpResponse::Ok().body("Hello world!")
}

#[post("/echo")]
async fn echo(req_body: String) -> impl Responder {
    HttpResponse::Ok().body(req_body)
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new()
            .service(hello)
            .service(echo)
    })
    .bind("127.0.0.1:8080")?
    .run()
    .await
}

網絡服務

構建高性能網絡應用:

// 使用 Tokio 的異步 TCP 服務器
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use tokio::net::TcpListener;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let listener = TcpListener::bind("127.0.0.1:8080").await?;

    loop {
        let (mut socket, _) = listener.accept().await?;
        
        tokio::spawn(async move {
            let mut buf = [0; 1024];
            
            // 讀取客户端數據
            let n = match socket.read(&mut buf).await {
                Ok(n) if n == 0 => return,
                Ok(n) => n,
                Err(e) => {
                    eprintln!("failed to read from socket; err = {:?}", e);
                    return;
                }
            };
            
            // 回傳數據
            if let Err(e) = socket.write_all(&buf[0..n]).await {
                eprintln!("failed to write to socket; err = {:?}", e);
            }
        });
    }
}

命令行工具

Rust 非常適合開發命令行工具:

use std::fs;
use std::io;
use clap::Parser;

/// 簡單的文件信息工具
#[derive(Parser)]
#[command(version, about, long_about = None)]
struct Cli {
    /// 要檢查的文件路徑
    path: std::path::PathBuf,
}

fn main() -> io::Result<()> {
    let args = Cli::parse();
    
    let metadata = fs::metadata(&args.path)?;
    println!("文件: {}", args.path.display());
    println!("大小: {} 字節", metadata.len());
    println!("類型: {}", if metadata.is_dir() { "目錄" } else { "文件" });
    
    Ok(())
}

遊戲開發

使用 Rust 進行遊戲開發:

// 使用 Bevy 遊戲引擎的簡單示例
use bevy::prelude::*;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_systems(Startup, setup)
        .add_systems(Update, (move_sprite, print_position))
        .run();
}

#[derive(Component)]
struct Player;

fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
    commands.spawn(Camera2dBundle::default());
    
    commands.spawn((
        SpriteBundle {
            texture: asset_server.load("player.png"),
            transform: Transform::from_xyz(0., 0., 0.),
            ..default()
        },
        Player,
    ));
}

fn move_sprite(
    keyboard_input: Res<Input<KeyCode>>,
    mut query: Query<&mut Transform, With<Player>>,
) {
    for mut transform in &mut query {
        if keyboard_input.pressed(KeyCode::Left) {
            transform.translation.x -= 2.0;
        }
        if keyboard_input.pressed(KeyCode::Right) {
            transform.translation.x += 2.0;
        }
    }
}

fn print_position(query: Query<&Transform, With<Player>>) {
    for transform in &query {
        println!("Player position: {}", transform.translation);
    }
}

開發工具與環境配置

安裝 Rust

下載地址:https://rust-lang.org/tools/install/ 如果是windows系統,那麼可以直接下載exe文件安裝。

【Rust】系統編程語言的核心語法以及常見應用場景淺談:系統、Web、網絡、命令行_生命週期_08


如果是linux相關的系統可以使用 Rustup 工具鏈管理器:

# 安裝 Rustup
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 更新 Rust
rustup update

# 檢查安裝
rustc --version
cargo --version

常用開發工具

  1. rust-analyzer: 現代 Language Server Protocol 實現,提供代碼補全、錯誤檢查等功能
  2. Clippy: Rust linting 工具,幫助編寫符合習慣的 Rust 代碼
  3. rustfmt: 代碼格式化工具

Cargo 使用指南

創建新項目

cargo new my_project
cd my_project

Cargo.toml 文件結構

[package]
name = "my_project"
version = "0.1.0"
edition = "2021"

[dependencies]
serde = "1.0"
tokio = { version = "1.0", features = ["full"] }

[dev-dependencies]
assert_eq = "0.1.0"

常用 Cargo 命令

# 構建項目
cargo build

# 構建並運行
cargo run

# 運行測試
cargo test

# 生成文檔
cargo doc --open

# 檢查代碼(不生成二進制文件)
cargo check

# 發佈構建
cargo build --release

IDE 與調試工具

VS Code 配置

博主由於是windows操作系統,所以直接下載exe,運行後,會彈出詢問,輸入y後,會再次詢問,回車就是默認安裝。

【Rust】系統編程語言的核心語法以及常見應用場景淺談:系統、Web、網絡、命令行_生命週期_09


【Rust】系統編程語言的核心語法以及常見應用場景淺談:系統、Web、網絡、命令行_Rust_10


安裝完畢之後,最好關閉VS後再打開,再查看版本是否已經安裝成功,如果出現版本號,那麼就是安裝成功。

【Rust】系統編程語言的核心語法以及常見應用場景淺談:系統、Web、網絡、命令行_生命週期_11


安裝以下擴展:

  • rust-analyzer - 官方語言服務器
  • Better TOML - TOML 文件支持
  • crates - 依賴版本檢查

Visual C++ 構建工具

下載地址:https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/

【Rust】系統編程語言的核心語法以及常見應用場景淺談:系統、Web、網絡、命令行_Web_12


運行文件,vs_BuildTools.exe

【Rust】系統編程語言的核心語法以及常見應用場景淺談:系統、Web、網絡、命令行_生命週期_13


JetBrains CLion / IntelliJ IDEA

安裝 Rust 插件獲得完整的 IDE 支持,包括:

  • 智能代碼補全
  • 重構工具
  • 調試器集成

調試器

# 使用 GDB 或 LLDB 調試 Rust 程序
cargo build
gdb target/debug/my_project

# 或者使用 Rust 專用的調試工具
cargo install cargo-lldb
cargo lldb

性能分析

# 使用 perf(Linux)
perf record ./target/release/my_project
perf report

# 使用 flamegraph
cargo install flamegraph
cargo flamegraph

測試框架
Rust 內置了強大的測試框架:

// 單元測試
#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_add() {
        assert_eq!(add(2, 2), 4);
    }

    #[test]
    #[should_panic]
    fn test_failure() {
        panic!("This test should fail");
    }

    // 集成測試(在 tests/ 目錄中)
    // 基準測試(使用 criterion 等外部庫)
}

總結

Rust 作為一門現代系統編程語言,通過其獨特的所有權系統和強大的類型系統,在保證內存安全和併發安全的同時,提供了與 C/C++ 相媲美的性能。無論是系統編程、Web 開發、網絡服務還是嵌入式開發,Rust 都能提供出色的解決方案。

隨着 Rust 生態系統的不斷成熟和社區的持續壯大,學習 Rust 不僅能夠幫助我們編寫更安全、更高效的代碼,還能讓我們掌握現代編程語言設計的先進理念。開始我們的 Rust 之旅,探索這門令人興奮的語言帶來的無限可能吧!