10.3 Rust代码示例
rust
复制代码
use std::collections::HashMap;
use std::sync::Arc;
use std::thread;

// 泛型结构体
#[derive(Debug, Clone)]
struct Point<T> {
    x: T,
    y: T,
}

// Trait(接口)
trait Area {
    fn area(&self) -> f64;
}

struct Circle {
    radius: f64,
}

impl Area for Circle {
    fn area(&self) -> f64 {
        std::f64::consts::PI * self.radius * self.radius
    }
}

// 错误处理:Result和Option
fn divide(a: f64, b: f64) -> Result<f64, String> {
    if b == 0.0 {
        Err("Division by zero".to_string())
    } else {
        Ok(a / b)
    }
}

// 模式匹配
fn describe_number(n: i32) -> &'static str {
    match n {
        0 => "zero",
        1..=9 => "single digit",
        n if n < 0 => "negative",
        _ => "large number",
    }
}

// 所有权和借用示例
fn main() {
    // 所有权转移
    let s1 = String::from("hello");
    let s2 = s1;  // s1不再有效,所有权转移到s2
    
    // 借用
    let mut vec = vec![1, 2, 3, 4, 5];
    let first = &vec[0];  // 不可变借用
    // vec.push(6);  // 错误!不能同时进行可变和不可变借用
    println!("First: {}", first);
    
    vec.push(6);  // 现在可以,因为first不再使用
    
    // 线程安全:所有权确保数据不竞争
    let shared_data = Arc::new(vec![1, 2, 3]);
    let mut handles = vec![];
    
    for _ in 0..10 {
        let data = Arc::clone(&shared_data);
        handles.push(thread::spawn(move || {
            println!("Data length: {}", data.len());
        }));
    }
    
    for handle in handles {
        handle.join().unwrap();
    }
    
    // 使用Option处理可能不存在的值
    let mut map: HashMap<String, i32> = HashMap::new();
    map.insert("key".to_string(), 42);
    
    match map.get("key") {
        Some(value) => println!("Found: {}", value),
        None => println!("Not found"),
    }
    
    // 使用?运算符传播错误
    let result = divide(10.0, 2.0)?;
    println!("Result: {}", result);
    
    // 使用迭代器和闭包
    let sum: i32 = (1..=100)
        .filter(|x| x % 2 == 0)
        .map(|x| x * x)
        .sum();
    println!("Sum of even squares: {}", sum);
}