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

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}");
}
http://www.xdnf.cn/news/2554.html

相关文章:

  • 复现:Mamba-UNet:降水临近预报的创新解决方案
  • LBS服务(基于位置的服务)与LLM(大型语言模型)交互功能分析
  • Vue+Echarts 3D地图效果
  • 配置扩展ACL
  • 前端连接websocket服务报错 Unexpected response code: 301
  • GTC2025全球流量大会:领驭科技以AI云端之力,助力中国企业出海破浪前行
  • Typecho博客使用阿里云cdn和oss:handsome主题进阶版
  • Vue 中局部指令(directives)的用法详解
  • STM32 RTC配置
  • JavaScript 中的类(Class)语法
  • Vue 组件通信方式总览
  • OpenCV 图形API(70)图像与通道拼接函数-----创建一个图像或矩阵(GMat)的副本的操作函数copy()
  • Maven多模块工程版本管理:flatten-maven-plugin扁平化POM
  • 打火机检测数据集VOC+YOLO格式925张1类别
  • 使用POI和EasyExcel使用导入
  • 实战指南:搭建AIRIOT全场景智慧养老管理平台系统全流程解析
  • 2025系统架构师---基于规则的系统架构风格‌
  • 【硬件系统架构】哈佛架构
  • Linux 内核网络协议栈中的关键数据结构:inet_skb_parm 与 ip_options
  • 媒体查询使用
  • 《Go 语言高并发爬虫开发:淘宝商品 API 实时采集与 ETL 数据处理管道》
  • 无刷空心杯电机及机器人灵巧手的技术解析与发展趋势
  • 关系型数据库的SQL语句
  • Paramiko 完全指南
  • 2. 第一个网页:前端基础入门
  • MySQL 表的约束(二)
  • 数据结构*栈
  • 微信小程序连续多个特殊字符自动换行解决方法
  • DSP48E2 的 MAC模式功能仿真
  • C#与SVN的深度集成:实现版本控制自动化管理​