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
}