【rust】match

match

#[derive(Debug, Clone)]
struct User {
    name: String,
    is_admin: bool,
    active: bool,
}

#[derive(Debug)]
struct Request {
    action: String,
    require_admin: bool,
}

// 处理请求逻辑
fn handle_request(user_opt: Option<User>, req: Request) {
    match user_opt {
        // 条件1:用户存在,且是 admin,就允许所有请求
        Some(user) if user.is_admin => {
            println!("Admin user {} allowed to do '{}'", user.name, req.action);
        }

        // 条件2:用户存在,非 admin,但请求也不需要 admin 权限
        Some(user) if user.active && !req.require_admin => {
            println!("User {} allowed to do '{}'", user.name, req.action);
        }

        // 条件3:用户存在,但不满足权限要求
        Some(user) => {
            println!("User {} is not allowed to do '{}'", user.name, req.action);
        }

        // 条件4:没有用户
        None => {
            println!("Anonymous users cannot do '{}'", req.action);
        }
    }
}

fn main() {
    let admin = Some(User {
        name: "Alice".to_string(),
        is_admin: true,
        active: true,
    });

    let user = Some(User {
        name: "Bob".to_string(),
        is_admin: false,
        active: true,
    });

    let inactive_user = Some(User {
        name: "Charlie".to_string(),
        is_admin: false,
        active: false,
    });

    let req_admin = Request {
        action: "Delete all files".to_string(),
        require_admin: true,
    };

    let req_normal = Request {
        action: "View dashboard".to_string(),
        require_admin: false,
    };

    handle_request(admin.clone(), req_admin.clone());     // ✅ Admin
    handle_request(user.clone(), req_normal.clone());     // ✅ Active normal user
    handle_request(user.clone(), req_admin.clone());      // ❌ Not admin
    handle_request(inactive_user.clone(), req_normal);    // ❌ Inactive
    handle_request(None, req_admin);                      // ❌ Anonymous
}

 

posted @ 2025-07-08 16:21  苏格拉底的落泪  阅读(8)  评论(0)    收藏  举报