当前位置: 首页 > news >正文

Rust 学习笔记:关于切片的两个练习题

Rust 学习笔记:关于切片的两个练习题

  • Rust 学习笔记:关于切片的两个练习题
    • 引用和切片引用的大小
    • 以下程序能否通过编译?

Rust 学习笔记:关于切片的两个练习题

参考视频:

  1. https://www.bilibili.com/video/BV1GrDQYeEzS

引用和切片引用的大小

考虑以下程序的 s2 和 s3 变量,它们的大小如何?

fn main() {let s = String::from("hello");let s2 = &s;let s3 = &s[..];println!("{}", size_of::<&String>());println!("{}", size_of::<&str>());
}

运行结果:

在这里插入图片描述

对于变量 s2,类型是 &String,它是一个引用。变量 s2 本身在内存中存储的是一个指针,在 64 位系统上,普通指针的大小是 8 字节,所以这个变量的大小是 size_of::<&String>(),即 8 字节。

而 s3 是切片,是 &str 类型,这是一个胖指针,包含指向数据的指针和长度,所以每个 &str 的大小是 16 字节。

以下程序能否通过编译?

fn main() {let mut s = String::from("hello");for &item in s.as_bytes().iter() {if item == b'l' {s.push_str(" world");}}println!("{s}");
}

不能通过编译。

s.as_bytes() 是对 s 的不可变借用,s.push_str() 是对 s 的可变借用,由于这里是在 for 循环中,会导致可变借用和不可变借用的作用于多次相互交叠,借用检查器为了安全起见,不允许这种做法。

改法一:从程序逻辑分析去修正,绕过借用问题

fn main() {let mut s = String::from("hello");let mut count = 0;for x in s.as_bytes().iter() {if *x == b'l' {count += 1;}}let to_push = " world".repeat(count);s.push_str(to_push.as_str());println!("{s}");
}

改法二:使用.to_owned()方法切断和源头的藕断丝连,使其自成一家

fn main() {let mut s = String::from("hello");for &item in s.as_bytes().to_owned().iter() {if item == b'l' {s.push_str(" world");}}println!("{s}");
}

相关文章:

  • 图像处理篇---信号与系统的应用
  • vitest | 测试框架vitest | 总结笔记
  • 数据库学习笔记(十三)---存储过程
  • npm error code CERT_HAS_EXPIRED
  • 【机器学习】人工智能在电力电子领域的应用
  • 代码随想录算法训练营第60期第二十一天打卡
  • SpringCloud组件——Gateway
  • Android adb 安装应用失败(安装次数限制)
  • Android Compose vs 传统View系统:全面对比与选型指南
  • Linux 定时备份到windows 方案比较
  • MCP Servers玩玩WebUI自动化
  • 凸包问题 Graham 扫描算法 MATLAB
  • Android Framework 探秘
  • 大模型训练平台:重构 AI 研发范式的智慧基建
  • 新ubuntu物理机开启ipv6让外网访问
  • RAG产品的核心功能原型及构成模块
  • 【星海出品】K8S调度器leader
  • 企业用电管理革新利器 —— Acrel-3000 电能管理系统应用解析
  • 腾讯云服务器独立ip服务器优点是什么?服务器需要固定ip吗?
  • 【MCP教程系列】如何自己打包MCP服务并部署到阿里云百炼上【nodejs+TypeScript】搭建自己的MCP【Cline】
  • 北京朝阳涉住宅组团地块126亿元成交
  • 第1现场|无军用物资!伊朗港口爆炸已遇难40人伤1200人
  • 稳就业稳经济五方面若干举措将成熟一项出台一项
  • 野猪穿过江苏电视台楼前广场,被抓捕后送往红山森林动物园
  • 仲裁法修订草案二审稿拟增加规定规制虚假仲裁
  • 一回合摘下“狮心”,张名扬霸气回应观众:再嘘一个我听听