Rust语法的核心特征简介

303 阅读4分钟

Rust 是一种注重安全性、性能和并发性的系统编程语言,由 Mozilla 开发。它通过所有权系统(Ownership)、生命周期(Lifetimes)和借用(Borrowing)等创新概念,在不牺牲性能的前提下提供内存安全保障。以下是 Rust 语法的核心特性简介:

1. 基础语法

变量声明与不可变性

Rust 变量默认不可变(Immutable),需显式声明 mut 变为可变:

rust

let x = 5;        // 不可变变量
let mut y = 10;   // 可变变量
y += 5;           // 合法:y 是可变的

数据类型

Rust 是静态类型语言,但支持类型推断:

rust

let integer: i32 = 42;       // 32位有符号整数
let float: f64 = 3.14;       // 64位浮点数
let boolean: bool = true;    // 布尔值
let character: char = '🦀';  // Unicode 字符(4字节)

2. 复合类型

元组(Tuple)

rust

let tup: (i32, f64, u8) = (500, 6.4, 1);
let (x, y, z) = tup;        // 解构赋值
println!("y 的值: {}", y);  // 输出: 6.4

数组(Array)

数组长度固定,类型统一:

rust

let a = [1, 2, 3, 4, 5];        // 自动类型推断为 [i32; 5]
let b: [i32; 3] = [1, 2, 3];    // 显式指定类型和长度
let first_element = a[0];       // 访问元素

3. 控制流

条件表达式

rust

let number = 3;
if number < 5 {
    println!("条件为真");
} else {
    println!("条件为假");
}

// 条件表达式可用于赋值
let result = if number % 2 == 0 {
    "偶数"
} else {
    "奇数"
};  // 注意分号:整个 if-else 是一个表达式

循环

rust

// 无限循环
loop {
    println!("这会无限执行,直到 break");
    break;  // 退出循环
}

// while 循环
let mut counter = 0;
while counter < 3 {
    println!("计数器: {}", counter);
    counter += 1;
}

// for 循环遍历数组
let a = [10, 20, 30];
for element in a.iter() {
    println!("元素: {}", element);
}

4. 函数

rust

fn add(a: i32, b: i32) -> i32 {  // 参数类型和返回值类型必须明确
    a + b  // 无分号:隐式返回最后一个表达式的值
}

fn main() {
    let result = add(3, 5);
    println!("3 + 5 = {}", result);  // 输出: 8
}

5. 所有权系统(核心特性)

Rust 通过所有权规则管理内存安全:

  1. 每个值都有一个变量作为其所有者

  2. 同一时间,一个值只能有一个所有者

  3. 当所有者离开作用域,值会被丢弃(drop)

rust

fn main() {
    let s1 = String::from("hello");  // s1 拥有字符串
    let s2 = s1;                     // 所有权从 s1 转移到 s2
    // println!("s1: {}", s1);        // 错误!s1 已失去所有权
    
    takes_ownership(s2);             // s2 的所有权转移到函数参数
    // println!("s2: {}", s2);        // 错误!s2 不再有效
    
    let x = 5;                       // 整数是 Copy 类型(无需所有权转移)
    makes_copy(x);                   // x 的值被复制到函数参数
    println!("x: {}", x);            // 合法:x 仍然有效
}

fn takes_ownership(s: String) {
    println!("{}", s);
}  // s 离开作用域,内存被释放

fn makes_copy(x: i32) {
    println!("{}", x);
}  // i32 实现了 Copy trait,无需释放内存

6. 借用与引用

通过引用(&)允许临时使用值而不获取所有权:

rust

fn main() {
    let s1 = String::from("hello");
    let len = calculate_length(&s1);  // 借用 s1 的引用,不转移所有权
    println!("字符串长度: {}", len);
    println!("s1: {}", s1);           // 合法:s1 仍拥有所有权
}

fn calculate_length(s: &String) -> usize {  // 参数为字符串引用
    s.len()
}  // s 离开作用域,但不拥有所有权,因此不释放内存

7. 结构体(Struct)

rust

struct User {
    username: String,
    email: String,
    active: bool,
    sign_in_count: u64,
}

fn main() {
    let user1 = User {
        email: String::from("user@example.com"),
        username: String::from("user123"),
        active: true,
        sign_in_count: 1,
    };
    
    // 访问结构体字段
    println!("用户邮箱: {}", user1.email);
}

8. 枚举(Enum)与模式匹配

rust

enum IpAddrKind {
    V4,
    V6,
}

struct IpAddr {
    kind: IpAddrKind,
    address: String,
}

fn main() {
    let home = IpAddr {
        kind: IpAddrKind::V4,
        address: String::from("127.0.0.1"),
    };
    
    // 模式匹配
    match home.kind {
        IpAddrKind::V4 => println!("IPv4 地址"),
        IpAddrKind::V6 => println!("IPv6 地址"),
    }
}

9. 错误处理

Rust 使用 Result<T, E> 枚举处理可能的错误:

rust

use std::fs::File;

fn main() {
    let f = File::open("hello.txt");
    
    let f = match f {
        Ok(file) => file,
        Err(error) => panic!("打开文件失败: {:?}", error),
    };
}

10. 特性(Trait)

类似于接口,定义行为规范:

rust

trait Summary {
    fn summarize(&self) -> String;
}

struct NewsArticle {
    headline: String,
    author: String,
}

impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!("{}, by {}", self.headline, self.author)
    }
}

fn main() {
    let article = NewsArticle {
        headline: String::from("重大新闻"),
        author: String::from("记者A"),
    };
    println!("文章摘要: {}", article.summarize());
}

总结

Rust 的核心优势在于其独特的内存安全模型(无需 GC)、高性能和强大的类型系统。虽然入门门槛较高,但其严格的编译时检查能帮助开发者避免许多运行时错误。对于追求系统级性能和安全性的项目(如操作系统、网络服务、嵌入式设备等),Rust 是理想选择。