Rust 学习-引用与解构(destructure)/解引用(dereference)

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),
}

解释:

  1. let reference = &String::from("hello"); 创建一个指向 String 的引用。
  2. match *reference 解引用该引用以获取它指向的 String 值。
  3. ref val 创建一个新的指向 String 值的引用。这避免了移动 String,允许在匹配分支内使用它。

2.解构引用

在 Rust 中解构引用允许你提取和处理引用指向的值。对于实现了 Copy 特性的类型,你可以直接提取值。对于非 Copy 类型,你可以直接匹配引用,或者在匹配臂中使用 ref 创建一个引用。当处理结构体时,你可以解构引用以直接访问它们的字段。这些模式确保了 Rust 的借用和所有权规则得到遵守。

2.1 具有 Copy 特性的类型

对于实现了 Copy 特性的类型(例如 i32),解构引用非常简单。

let reference = &4;
match reference {
    &val => println!("通过解构获得的值: {}", val),
}

解释:

  1. let reference = &4; 创建一个指向值 4 的引用。
  2. match reference 匹配该引用。
  3. 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),
}

解释:

  1. let point = Point { x: 10, y: 20 }; 创建一个 Point 结构体。
  2. let reference = &point; 创建一个指向 Point 的引用。
  3. match reference 匹配该引用。
  4. &Point { x, y } 解构引用,允许访问字段 xy

2.4 总结

解构引用允许你提取和处理引用指向的值。对于 Copy 类型,你可以直接提取值。对于非 Copy 类型,你可以直接匹配引用或使用 ref 在匹配分支内创建一个引用。当处理结构体时,你可以解构引用以直接访问它们的字段。这些模式确保了 Rust 的借用和所有权规则得到遵守。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值