Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第1章:Rust 概述与环境搭建

学习目标

  • 理解 Rust 的设计理念和核心特性
  • 掌握 Rust 开发环境的标准配置流程
  • 学会使用 Cargo 包管理工具
  • 了解 Rust 的编译和运行机制

1.1 Rust 语言概述

1.1.1 Rust 的诞生背景

Rust 是 Mozilla 在 2006 年开始研发的系统编程语言,目标是在保持 C++ 性能的同时解决内存安全问题。

#![allow(unused)]
fn main() {
// Rust 的哲学:安全、并发、实用
// 不需要垃圾回收器手动管理内存
// 编译时保证内存安全
// 零成本抽象 - 性能无损失
}

1.1.2 核心特性

内存安全

Rust 通过编译时严格的规则(如所有权和借用检查)防止常见的内存错误,包括空指针解引用、缓冲区溢出、数据竞争和悬垂引用。这无需运行时垃圾回收或手动内存管理,而是让编译器在构建时捕获潜在问题,确保代码在不牺牲性能的前提下高度可靠,特别适合系统级开发。

#![allow(unused)]
fn main() {
// 编译时防止常见内存错误
fn demonstrate_memory_safety() {
    let string = String::from("Hello");
    let slice = &string; // 借用,不转移所有权
    // 编译时确保不会有野指针或内存泄漏
    println!("{}", slice);
    
    // let mut data = vec![1, 2, 3];
    // let slice = &data;  // 不可变借用
    // data.push(4);       // 编译错误!违反了借用规则
}
}

零成本抽象

Rust 允许开发者使用高级抽象(如泛型、trait 和迭代器)来编写简洁、表达力强的代码,但这些抽象在编译后不会引入任何运行时开销。生成的机器码与直接用低级代码(如循环)编写的一样高效,这意味着“抽象不会让你付出代价”,促进了可维护性和性能的平衡。

#![allow(unused)]
fn main() {
// 高级语言特性不带来性能损失
fn high_level_abstraction() {
    let numbers: Vec<i32> = (0..1000).collect();
    
    // 高级的函数式编程风格
    let sum: i32 = numbers
        .iter()
        .filter(|&&x| x % 2 == 0)     // 只保留偶数
        .map(|&x| x * x)              // 平方
        .sum();                       // 求和
    
    // 编译器会优化为类似 C 代码的性能
    println!("平方偶数和: {}", sum);
}
}

所有权系统

这是 Rust 的核心创新:每个值都有一个唯一所有者,当所有者超出作用域时,值自动被释放(通过 drop 机制)。所有权可以转移(move)或借用(immutable & 或 mutable &mut),编译器强制执行这些规则,避免内存泄漏、双重释放和无效访问,实现静态保证的内存管理。

#![allow(unused)]
fn main() {
// 所有权和借用保证内存安全
fn ownership_demo() {
    // 所有权转移
    let data = vec![1, 2, 3];
    let transferred = data; // data 移动到 transferred
    
    // println!("{:?}", data); // 编译错误!data 已经移动
    println!("{:?}", transferred); // 正常
    
    // 借用(引用)
    let reference = &transferred;
    println!("引用值: {:?}", reference); // 读取操作不需要所有权
    
    // 多重引用
    let another_ref = &transferred;
    // 但是不能有可变引用
    // let mut_ref = &mut transferred; // 编译错误!
    
    println!("两个引用: {:?}, {:?}", reference, another_ref);
}
}

1.2 安装 Rust 开发环境

1.2.1 使用 rustup 安装

# 安装 Rust 工具链
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 重新加载环境变量
source ~/.cargo/env

# 验证安装
rustc --version
cargo --version

# 更新 Rust
rustup update

# 查看所有安装的版本
rustup show

1.2.2 工具链管理

# 查看可用工具链
rustup target list --installed

# 添加新目标平台
rustup target add x86_64-pc-windows-msvc
rustup target add x86_64-apple-darwin
rustup target add aarch64-unknown-linux-gnu

# 切换工具链
rustup default stable
rustup default nightly

1.2.3 开发工具推荐

# 安装常用开发工具
cargo install cargo-watch     # 文件监控自动重编译
cargo install cargo-audit     # 安全漏洞检查
cargo install cargo-clippy    # 代码质量检查
cargo install rust-analyzer   # 语言服务器协议

# VS Code 扩展
# - Rust Analyzer
# - rust-analyzer
# - Rust Test Explorer
# - CodeLLDB (调试器)

1.3 Cargo 包管理详解

1.3.1 创建新项目

# 创建二进制可执行项目
cargo new my_project
cd my_project

# 创建库项目
cargo new --lib my_library

# 创建脚手架项目
cargo generate --git https://github.com/rustwasm/wasm-pack-template

1.3.2 Cargo.toml 配置文件

# my_project/Cargo.toml
[package]
name = "my_project"           # 项目名称
version = "0.1.0"            # 版本号
edition = "2021"             # Rust 版本
authors = ["Your Name <email@example.com>"]
license = "MIT"              # 许可证
description = "A sample Rust project"
repository = "https://github.com/user/my_project"
keywords = ["rust", "example", "demo"]
categories = ["development-tools"]
documentation = "https://docs.rs/my_project"
readme = "README.md"

# 项目依赖
[dependencies]
# 基础依赖
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tokio = { version = "1.0", features = ["full"] }

# 可选依赖
rand = "0.8"
chrono = { version = "0.4", optional = true }

# 开发依赖
[dev-dependencies]
tempfile = "3.0"
mockall = "0.11"

# 构建脚本依赖
[build-dependencies]
cc = "1.0"

# 功能标志
[features]
default = ["json"]
json = ["serde_json"]
csv = ["serde_csv"]
chrono_time = ["chrono"]

1.3.3 项目结构说明

my_project/
├── src/                      # 源代码目录
│   ├── main.rs              # 入口文件
│   ├── lib.rs               # 库入口(可选)
│   ├── mod1/                # 模块目录
│   │   ├── mod.rs
│   │   └── submodule.rs
│   └── utils/               # 工具模块
│       ├── mod.rs
│       └── helpers.rs
├── Cargo.toml               # 项目配置
├── Cargo.lock               # 依赖锁定(自动生成)
├── README.md                # 项目说明
├── CHANGELOG.md             # 更新日志
├── LICENSE                  # 许可证文件
├── .gitignore              # Git 忽略文件
├── tests/                   # 集成测试
├── examples/                # 示例代码
├── benches/                 # 性能测试
└── target/                  # 构建输出(自动生成)
    ├── debug/               # 调试构建
    └── release/             # 发布构建

1.4 第一个 Rust 程序

1.4.1 基础 Hello World

// src/main.rs
// 单行注释

/*
   多行注释
   这是我们的第一个 Rust 程序
*/

fn main() {
    // println! 是一个宏(用 ! 表示)
    println!("Hello, Rust World!");
    
    // 变量和类型
    let name = "Rust 开发者";
    let version = 1.0;
    let is_awesome = true;
    
    println!("欢迎 {}!Rust 版本 {}", name, version);
    
    // 格式化输出
    println!("{} 是 {} 编程语言", "Rust", "现代");
    println!("{subject} {verb} {object}", 
             subject="Rust", verb="是", object="安全");
    
    // 占位符
    println!("十进制: {}", 42);
    println!("十六进制: {:#x}", 255);
    println!("二进制: {:#b}", 15);
    println!("科学计数法: {}", 123.456789);
    
    // 命名参数
    println!("{language} 在 {year} 年发布了!", 
             language="Rust", year=2021);
}

Result:

Hello, Rust World!
欢迎 Rust 开发者!Rust 版本 1
Rust 是 现代 编程语言
Rust 是 安全
十进制: 42
十六进制: 0xff
二进制: 0b1111
科学计数法: 123.456789
Rust 在 2021 年发布了!

{} 是格式化占位符(placeholder),用于在字符串中插入变量值。它类似于 C 中的 printf 中的 %s 或 Python 的 f-string 中的 {},但 Rust 使用基于 std::fmt 模块的强大格式化系统。

作用:每个 {} 会按顺序被后面的参数(如 name 和 version)替换。编译时,Rust 会检查类型匹配(例如,name 必须实现 Display trait 以便打印)。

默认行为:{} 表示使用 {:?} 或 {}(取决于上下文),但通常是 {} 用于人类可读的字符串表示。

位置:占位符按从左到右的顺序匹配参数。如果参数多于占位符,会忽略多余的。

1.4.2 构建和运行

# 开发模式构建和运行
cargo run

# 调试构建
cargo build

# 发布构建(优化)
cargo build --release

# 仅编译检查(快速验证)
cargo check

# 运行示例
cargo run --example hello_world

# 运行测试
cargo test

# 运行基准测试
cargo bench

1.4.3 依赖管理

// src/main.rs - 使用外部依赖
use rand::Rng;        // 随机数生成器
use serde_json::{json, Value}; // JSON 处理

fn main() {
    // 随机数示例
    let random_number = rand::thread_rng().gen_range(1..=100);
    println!("随机数: {}", random_number);
    
    // JSON 序列化示例
    let data = json!({
        "name": "Alice",
        "age": 30,
        "skills": ["Rust", "Python", "JavaScript"]
    });
    
    let json_string = serde_json::to_string_pretty(&data)
        .expect("JSON 序列化失败");
    
    println!("JSON 数据:");
    println!("{}", json_string);
}

1.5 项目实践:Rust 开发环境配置工具

1.5.1 项目需求分析

创建一个自动化工具帮助开发团队配置统一的 Rust 开发环境:

#![allow(unused)]
fn main() {
// 项目目标:
// 1. 检测当前环境状态
// 2. 自动安装/更新 Rust 工具链
// 3. 配置开发工具
// 4. 生成项目模板
// 5. 提供回滚功能
}

1.5.2 项目结构设计

// src/main.rs
use std::process;

mod commands;
mod utils;
mod config;

use commands::{EnvironmentDetector, ToolInstaller, TemplateGenerator};
use utils::{Logger, ErrorHandler};
use config::Settings;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 初始化日志
    let logger = Logger::new("rustdev-setup");
    logger.info("开始环境配置");
    
    // 加载配置
    let settings = Settings::load_from_file("config.toml")?;
    
    // 检测环境
    let detector = EnvironmentDetector::new(&logger);
    let environment = detector.detect()?;
    
    logger.info(format!("检测到环境: {:?}", environment));
    
    // 安装工具
    let installer = ToolInstaller::new(&settings, &logger);
    installer.install_all(&environment)?;
    
    // 生成模板
    let generator = TemplateGenerator::new(&settings, &logger);
    generator.generate_templates()?;
    
    logger.info("环境配置完成!");
    
    Ok(())
}

1.5.3 环境检测模块

#![allow(unused)]
fn main() {
// src/commands/detect.rs
use std::env;
use std::process::Command;
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SystemInfo {
    pub os: OperatingSystem,
    pub architecture: String,
    pub shell: String,
    pub home_dir: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum OperatingSystem {
    Linux(String),
    MacOS(String),
    Windows(String),
    Unknown(String),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RustInfo {
    pub version: String,
    pub toolchain: String,
    pub target: Vec<String>,
    pub cargo_version: String,
}

pub struct EnvironmentDetector {
    logger: Box<dyn Logger>,
}

impl EnvironmentDetector {
    pub fn new(logger: Box<dyn Logger>) -> Self {
        Self { logger }
    }
    
    pub fn detect(&self) -> Result<Environment, Error> {
        self.logger.info("开始检测系统环境");
        
        let system_info = self.detect_system_info()?;
        let rust_info = self.detect_rust_info()?;
        let tools_info = self.detect_development_tools()?;
        
        Ok(Environment {
            system: system_info,
            rust: rust_info,
            tools: tools_info,
        })
    }
    
    fn detect_system_info(&self) -> Result<SystemInfo, Error> {
        let os = env::consts::OS;
        let arch = env::consts::ARCH;
        let shell = env::var("SHELL").unwrap_or_default();
        let home = env::var("HOME").unwrap_or_default();
        
        let operating_system = match os {
            "linux" => OperatingSystem::Linux(self.get_distro_name()?),
            "macos" => OperatingSystem::MacOS(self.get_macos_version()?),
            "windows" => OperatingSystem::Windows(self.get_windows_version()?),
            _ => OperatingSystem::Unknown(os.to_string()),
        };
        
        Ok(SystemInfo {
            os: operating_system,
            architecture: arch.to_string(),
            shell,
            home_dir: home,
        })
    }
    
    fn detect_rust_info(&self) -> Result<RustInfo, Error> {
        // 检查 rustc 版本
        let rustc_output = self.run_command("rustc", &["--version"])?;
        let rustc_version = rustc_output.trim().to_string();
        
        // 检查 cargo 版本
        let cargo_output = self.run_command("cargo", &["--version"])?;
        let cargo_version = cargo_output.trim().to_string();
        
        // 获取默认工具链
        let default_toolchain = self.run_command("rustup", &["default"])?
            .trim()
            .to_string();
        
        // 获取已安装目标
        let targets_output = self.run_command("rustup", &["target", "list", "--installed"])?;
        let targets: Vec<String> = targets_output
            .lines()
            .filter(|line| !line.trim().is_empty())
            .map(|line| line.trim().to_string())
            .collect();
        
        Ok(RustInfo {
            version: rustc_version,
            toolchain: default_toolchain,
            target: targets,
            cargo_version: cargo_version,
        })
    }
    
    fn run_command(&self, command: &str, args: &[&str]) -> Result<String, Error> {
        match Command::new(command).args(args).output() {
            Ok(output) => {
                if output.status.success() {
                    Ok(String::from_utf8_lossy(&output.stdout).to_string())
                } else {
                    let stderr = String::from_utf8_lossy(&output.stderr);
                    Err(Error::CommandFailed(command.to_string(), stderr.to_string()))
                }
            }
            Err(e) => Err(Error::CommandNotFound(command.to_string(), e.to_string())),
        }
    }
}

// 错误处理
#[derive(Debug, thiserror::Error)]
pub enum Error {
    #[error("命令执行失败: {0} - {1}")]
    CommandFailed(String, String),
    #[error("命令未找到: {0} - {1}")]
    CommandNotFound(String, String),
    #[error("系统检测错误: {0}")]
    SystemDetection(String),
}
}

1.5.4 工具安装模块

#![allow(unused)]
fn main() {
// src/commands/install.rs
use std::path::Path;
use std::fs;

pub struct ToolInstaller {
    settings: Box<Settings>,
    logger: Box<dyn Logger>,
}

impl ToolInstaller {
    pub fn new(settings: &Settings, logger: Box<dyn Logger>) -> Self {
        Self {
            settings: Box::new(settings.clone()),
            logger,
        }
    }
    
    pub fn install_all(&self, environment: &Environment) -> Result<(), Error> {
        self.logger.info("开始安装开发工具");
        
        // 安装/更新 Rust 工具链
        self.install_rust_toolchain(environment)?;
        
        // 安装常用工具
        self.install_cargo_tools()?;
        
        // 配置开发环境
        self.configure_development_environment()?;
        
        self.logger.info("工具安装完成");
        Ok(())
    }
    
    fn install_rust_toolchain(&self, environment: &Environment) -> Result<(), Error> {
        self.logger.info("安装/更新 Rust 工具链");
        
        // 确保 rustup 安装
        if !self.command_exists("rustup") {
            self.run_with_progress("安装 rustup", || {
                Command::new("curl")
                    .args(&["--proto", "=https", "--tlsv1.2", "-sSf", 
                             "https://sh.rustup.rs"])
                    .stdout(std::process::Stdio::piped())
                    .spawn()?
                    .wait()
            })?;
        }
        
        // 更新 Rust
        self.run_command("rustup", &["update"])?;
        
        // 安装常用目标
        for target in &self.settings.common_targets {
            self.run_command("rustup", &["target", "add", target])?;
        }
        
        Ok(())
    }
    
    fn install_cargo_tools(&self) -> Result<(), Error> {
        self.logger.info("安装 Cargo 工具");
        
        for tool in &self.settings.cargo_tools {
            self.logger.info(format!("安装工具: {}", tool.name));
            
            let install_args = vec!["install", &tool.package];
            self.run_command("cargo", &install_args)?;
        }
        
        Ok(())
    }
    
    fn configure_development_environment(&self) -> Result<(), Error> {
        self.logger.info("配置开发环境");
        
        // 创建 .cargo/config.toml
        self.create_cargo_config()?;
        
        // 创建项目模板目录
        self.create_template_directories()?;
        
        Ok(())
    }
    
    fn create_cargo_config(&self) -> Result<(), Error> {
        let config_path = dirs::home_dir()
            .unwrap_or_default()
            .join(".cargo/config.toml");
        
        let config_content = format!(r#"
[http]
check-revoke = false

[source.crates-io]
replace-with = "vendored-sources"

[source.vendored-sources]
directory = "vendor"

[net]
git-fetch-with-cli = true
"#);
        
        fs::write(&config_path, config_content)?;
        Ok(())
    }
}

// 工具配置
#[derive(Clone)]
pub struct ToolConfig {
    pub name: String,
    pub package: String,
    pub description: String,
}

#[derive(Clone)]
pub struct Settings {
    pub common_targets: Vec<String>,
    pub cargo_tools: Vec<ToolConfig>,
}

impl Default for Settings {
    fn default() -> Self {
        Self {
            common_targets: vec![
                "x86_64-unknown-linux-gnu".to_string(),
                "x86_64-pc-windows-msvc".to_string(),
                "aarch64-unknown-linux-gnu".to_string(),
            ],
            cargo_tools: vec![
                ToolConfig {
                    name: "ripgrep".to_string(),
                    package: "ripgrep".to_string(),
                    description: "快速文件搜索工具".to_string(),
                },
                ToolConfig {
                    name: "fd".to_string(),
                    package: "fd".to_string(),
                    description: "现代化 find 替代品".to_string(),
                },
                ToolConfig {
                    name: "exa".to_string(),
                    package: "exa".to_string(),
                    description: "现代化 ls 替代品".to_string(),
                },
            ],
        }
    }
}
}

1.5.5 模板生成模块

// src/commands/generate.rs
use std::fs;
use std::path::Path;
use handlebars::{Handlebars, no_escape};
use serde_json::json;

pub struct TemplateGenerator {
    settings: Box<Settings>,
    logger: Box<dyn Logger>,
    handlebars: Handlebars<'static>,
}

impl TemplateGenerator {
    pub fn new(settings: &Settings, logger: Box<dyn Logger>) -> Self {
        let mut handlebars = Handlebars::new();
        handlebars.set_strict_mode(true);
        handlebars.register_escape_fn(no_escape);
        
        // 注册模板
        handlebars.register_template_string("project", PROJECT_TEMPLATE)?;
        handlebars.register_template_string("gitignore", GITIGNORE_TEMPLATE)?;
        handlebars.register_template_string("rustfmt", RUSTFMT_TEMPLATE)?;
        handlebars.register_template_string("clippy", CLIPPY_TEMPLATE)?;
        
        Ok(Self {
            settings: Box::new(settings.clone()),
            logger,
            handlebars,
        })
    }
    
    pub fn generate_templates(&self) -> Result<(), Error> {
        self.logger.info("生成项目模板");
        
        // 创建模板目录
        let template_dir = std::env::current_dir()?
            .join("rustdev-templates");
        fs::create_dir_all(&template_dir)?;
        
        // 生成项目模板
        self.generate_project_template(&template_dir)?;
        
        // 生成配置文件
        self.generate_config_files(&template_dir)?;
        
        self.logger.info("模板生成完成");
        Ok(())
    }
    
    fn generate_project_template(&self, base_dir: &Path) -> Result<(), Error> {
        let project_template_dir = base_dir.join("project");
        fs::create_dir_all(&project_template_dir)?;
        
        let template_data = json!({
            "project_name": "my-rust-project",
            "version": "0.1.0",
            "authors": ["Your Name <email@example.com>"],
            "description": "A Rust project generated with rustdev-setup"
        });
        
        // 生成 Cargo.toml
        let cargo_toml = self.handlebars.render("project", &template_data)?;
        fs::write(project_template_dir.join("Cargo.toml"), cargo_toml)?;
        
        // 生成 main.rs
        fs::write(project_template_dir.join("src/main.rs"), MAIN_RS_TEMPLATE)?;
        
        // 生成 README.md
        let readme = self.handlebars.render("project", &template_data)?;
        fs::write(project_template_dir.join("README.md"), readme)?;
        
        Ok(())
    }
}

// 项目模板
const PROJECT_TEMPLATE: &str = r#"
[package]
name = "{{project_name}}"
version = "{{version}}"
authors = {{#each authors}}"{{this}}"{{#unless @last}}, {{/unless}}{{/each}}
description = "{{description}}"
edition = "2021"

[dependencies]
常用依赖
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tokio = { version = "1.0", features = ["full"] }

[dev-dependencies]
tempfile = "3.0"
mockall = "0.11"

[build-dependencies]
cc = "1.0"
"#;

const MAIN_RS_TEMPLATE: &str = r#"
use std::error::Error;
use std::process;

fn main() -> Result<(), Box<dyn Error>> {
    println!("Hello, {{project_name}}!");
    
    // 你的代码在这里
    // 记得处理错误
    // process::exit(1);
    
    Ok(())
}
"#;

// 配置文件模板
const RUSTFMT_TEMPLATE: &str = r#"
edition = "2021"
unstable_features = true
imports_granularity = "Crate"
group_imports = "StdExternalCrate"
use_small_heuristics = "Default"
reorder_impl_items = true
"#;

const GITIGNORE_TEMPLATE: &str = r#"
目标目录
target/
Cargo.lock

IDE 文件
.vscode/
.idea/
*.swp
*.swo
*~

操作系统
.DS_Store
Thumbs.db

临时文件
*.tmp
*.log
.env

Rust
rustc-*
debug/
"#;

const CLIPPY_TEMPLATE: &str = r#"
允许的 clippy 规则
[lint.clippy::all]
allow = [
    "module_name_repetitions",
    "similar_names",
    "too_many_arguments"
]

允许的 clippy 警告
[lint.clippy::allow]
allow = [
    "missing_docs_in_private_items"
]
"#;

1.6 最佳实践和注意事项

1.6.1 开发环境配置最佳实践

#![allow(unused)]
fn main() {
// 1. 使用工具链管理器
// ~/.cargo/config.toml
[toolchain]
channel = "stable"
targets = ["x86_64-unknown-linux-gnu"]
profile = "minimal"

[build]
target = "x86_64-unknown-linux-gnu"

[net]
git-fetch-with-cli = true
}

1.6.2 代码质量工具

#![allow(unused)]
fn main() {
// 集成到构建过程
use cargo_toml;
use std::path::Path;

fn run_quality_checks() -> Result<(), Box<dyn std::error::Error>> {
    // 1. 格式检查
    std::process::Command::new("cargo")
        .args(&["fmt", "--check"])
        .status()?;
    
    // 2. 静态分析
    std::process::Command::new("cargo")
        .args(&["clippy"])
        .status()?;
    
    // 3. 安全检查
    std::process::Command::new("cargo")
        .args(&["audit"])
        .status()?;
    
    // 4. 测试
    std::process::Command::new("cargo")
        .args(&["test"])
        .status()?;
    
    Ok(())
}
}

1.6.3 常见问题解决

#![allow(unused)]
fn main() {
// 常见错误和解决方案
fn troubleshooting_guide() {
    // 1. 编译错误
    // 错误:borrowed value does not live long enough
    // 解决:确保引用生命周期
    
    let data = vec![1, 2, 3];
    let reference = &data;
    // println!("{:?}", data); // 编译错误
    
    // 2. 所有权移动错误
    let string1 = String::from("hello");
    let string2 = string1; // 移动所有权
    // println!("{}", string1); // 编译错误
    println!("{}", string2);
    
    // 3. 可变性错误
    let mut counter = 0;
    counter += 1; // 需要 mut 声明
    
    // 4. 借用检查器错误
    let mut data = vec![1, 2, 3];
    let first = &data[0]; // 不可变借用
    // data.push(4); // 编译错误,因为存在借用
    
    println!("{}", first);
}
}

1.7 练习题

练习 1.1:环境检测

创建一个简单的环境检测工具,检查:

  • 当前操作系统
  • Rust 版本信息
  • 已安装的 Cargo 工具

练习 1.2:项目模板

设计一个脚手架工具,能够:

  • 生成标准的 Rust 项目结构
  • 配置常用的依赖
  • 创建 Git 仓库

练习 1.3:工具链管理

开发一个工具来:

  • 管理多个 Rust 工具链
  • 切换默认工具链
  • 安装和管理目标平台

1.8 本章总结

通过本章学习,你已经掌握了:

  1. Rust 语言基础概念:内存安全、所有权系统、零成本抽象
  2. 环境安装配置:rustup 工具链管理、工具链切换
  3. Cargo 包管理:项目结构、依赖管理、构建过程
  4. 实践项目:企业级开发环境配置工具

关键要点

  • Rust 的设计哲学和安全特性
  • 工具链的安装和管理
  • Cargo 工作流
  • 项目结构最佳实践

下一步

  • 深入学习 Rust 语法
  • 掌握变量和数据类型
  • 理解所有权和借用
  • 开发实战项目

练习答案和更多资源将在后续章节中提供。记住,实践是掌握 Rust 的最佳方式!