有时有必要仅使用引用就可以从对象中提取值(即,无需转让所有权)。
struct Token { pub id: u32 } struct User { pub token: Option<Token> } fn main() { // 创建具有任意令牌的用户 let user = User { token: Some(Token { id: 3 }) }; // 让我们通过引用来借用用户 let user_ref = &user; // This match expression would not compile saying "cannot move out of borrowed // content" because user_ref is a borrowed value but token expects an owned value. match user_ref { &User { token } => println!("User token exists? {}", token.is_some()) } // 通过在我们的模式中添加“ ref”,我们指示编译器为我们提供参考 // 而不是拥有的价值。 match user_ref { &User { ref token } => println!("User token exists? {}", token.is_some()) } // 我们也可以将ref与销毁相结合 match user_ref { // 'ref'将允许我们通过引用访问期权内部的令牌 &User { token: Some(ref user_token) } => println!("Token value: {}", user_token.id ), &User { token: None } => println!("There was no token assigned to the user" ) } // 引用也可以是可变的,让我们创建另一个用户来演示这一点 let mut other_user = User { token: Some(Token { id: 4 }) }; // 给用户一个可变的参考 let other_user_ref_mut = &mut other_user; match other_user_ref_mut { // 'ref mut'为我们提供了可变的引用,使我们可以直接更改包含的值。 &mut User { token: Some(ref mut user_token) } => { user_token.id = 5; println!("New token value: {}", user_token.id ) }, &mut User { token: None } => println!("There was no token assigned to the user" ) } }
它将打印此:
User token exists? true Token value: 3 New token value: 5