每日见闻之Rust中的引用

引用分为可变引用与不可变引用

1.1 不可变引用

代码示例

js 复制代码
fn main() {
    let s1 = String::from("I am a superman.");
    let s2 = &s1;
    let s3 = &&&&&s1;
    let s4 = &s2;
    let s5 = s2;
}

知识点

  • 通过在变量前面加 & 就是不可变引用 比如 &s1

  • s1 是所有权变量,拥有字符串的所有权。

  • let s2 = &s1 s1是引用变量,是对所有权变量s1的引用。

  • let s3 = &&&&&s1; 这里s3是s1的多级引用,本质上跟s2(一级引用没有什么太大的区别)

  • let s4 = &s2 s4是s1的间接引用,等效于 let s4 = &&s1

  • let s5 = s2 把引用变量s2直接赋值给s5,这里是进行的copy,不是move,copy的话就是s5 根 s2 是独立的,都可以正常使用,如果是move的话,被move的就不可以再次使用了。这里执行copy,主要是因为引用变量是固定size的变量。

1.2 可变引用

js 复制代码
fn main() {
    let mut a = 10u32;
    let b = &mut a;
    *b = 20;

    println!("{b}");
}
// 输出 
20

知识点

  • 通过在变量前面加 &mut 就是不可变引用 比如 &mut s1

  • let b = &mut a; 这里b就是a的可变引用。

*b = 20;b是可变引用,所以可以通过b修改a的值。这里的 * 是解引用的意思,有几级引用就需要解几次。

  • 这里通过b修改a的值的前提是a也必须是可变的。因为b解引用最终是解到他最开始引用的那个变量,然后在通过那个变量修改值。在这里*b = 20 等同于 a = 20,因为a是可变的所以可以赋值,如果a是不可变的这里也是不能赋值修改的.
相关推荐
市场部需要一个软件开发岗位28 分钟前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
JMchen1232 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
crmscs3 小时前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob3 小时前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔3 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei9963 小时前
flutter和Android动画的对比
android·flutter·动画
lxysbly5 小时前
md模拟器安卓版带金手指2026
android
儿歌八万首6 小时前
硬核春节:用 Compose 打造“赛博鞭炮”
android·kotlin·compose·春节
消失的旧时光-19438 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
Jinkxs8 小时前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin