Rust 学习-引用与解构(destructure)/解引用(dereference)
//引用
let reference = &1;
//解构
match reference {
&val => println!("Got a value via destructuring: {:?}", val),
}
//解引用
match *reference {
val => println!("Got a value via dereferencing: {:?}", val),
}
1.解引用
当你解引用(例如,*reference
)时,类似 c++ 指针访问的是原始值。后续上面例子的 val 被赋值,因为 i32 实现了 copy 则 4 被 copy 后赋值给 val
1.1 使用解引用和 ref
重新借用
let reference = &String::from("hello");
match *reference {
ref val => println!("通过解引用和重新借用获得的值: {:?}", val),
}
解释:
let reference = &String::from("hello");
创建一个指向String
的引用。match *reference
解引用该引用以获取它指向的String
值。ref val
创建一个新的指向String
值的引用。这避免了移动String
,允许在匹配分支内使用它。
2.解构引用
在 Rust 中解构引用允许你提取和处理引用指向的值。对于实现了 Copy
特性的类型,你可以直接提取值。对于非 Copy
类型,你可以直接匹配引用,或者在匹配臂中使用 ref
创建一个引用。当处理结构体时,你可以解构引用以直接访问它们的字段。这些模式确保了 Rust 的借用和所有权规则得到遵守。
2.1 具有 Copy 特性的类型
对于实现了 Copy
特性的类型(例如 i32
),解构引用非常简单。
let reference = &4;
match reference {
&val => println!("通过解构获得的值: {}", val),
}
解释:
let reference = &4;
创建一个指向值4
的引用。match reference
匹配该引用。match
分支中的&val
解构引用,提取值4
并将其绑定到val
。
2.2 具有非 Copy 特性的类型
对于没有实现 Copy
特性的类型(例如 String
),你需要以不同的方式处理引用。
2.2.1 直接匹配引用
let reference = &String::from("hello");
match reference {
val => println!("通过借用获得的值: {:?}", val),
}
在这个例子中:
val
被直接匹配为指向String
的引用。这是最简单的方法,并直接处理引用。
2.2.2 错误使用示范
let reference = &String::_from_("hello");
match reference {
&val => println!("Got a value via destructuring: {:?}", val), // This will not work
}
这样会触发:
3 | match reference {
| ^^^^^^^^^
4 | &val => println!("Got a value via destructuring: {:?}", val), // This will not work
| ---
| |
| data moved here
| move occurs because `val` has type `String`, which does not implement the `Copy` trait
2.3 解构结构体引用
当处理更复杂的类型如结构体时,你也可以解构引用以访问它们的字段。
结构体示例
struct Point {
x: i32,
y: i32,
}
let point = Point { x: 10, y: 20 };
let reference = &point;
match reference {
&Point { x, y } => println!("点的坐标: ({}, {})", x, y),
}
解释:
let point = Point { x: 10, y: 20 };
创建一个Point
结构体。let reference = &point;
创建一个指向Point
的引用。match reference
匹配该引用。&Point { x, y }
解构引用,允许访问字段x
和y
。
2.4 总结
解构引用允许你提取和处理引用指向的值。对于 Copy
类型,你可以直接提取值。对于非 Copy
类型,你可以直接匹配引用或使用 ref
在匹配分支内创建一个引用。当处理结构体时,你可以解构引用以直接访问它们的字段。这些模式确保了 Rust 的借用和所有权规则得到遵守。