当前位置: 首页 > 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}");
}

http://www.mrgr.cn/news/100548.html

相关文章:

  • SNMP协议之详解(Detailed Explanation of SNMP Protocol)
  • 浅谈PCB传输线(一)
  • 嵌入式RTOS实战:uC/OS-III最新版移植指南(附项目源码)
  • 构建“云中”高并发:12306技术改造的系统性启示
  • 来聊聊JVM中安全点的概念
  • 电子监管码预检剔除装置提示盒尺寸过短
  • 网络安全入门综述
  • 【Robocorp实战指南】Python驱动的开源RPA框架
  • 集成学习详解
  • 计算机视觉进化论:YOLOv12、YOLOv11与Darknet系YOLOv7的微调实战对比
  • [蓝桥杯刷题]---模拟法[2]日期问题
  • 配置RSUniVLM环境(自用)
  • [Jupyter Notebook]:Jupyter Notebook 安装教程(代码编辑器)
  • Zabbix
  • openbmc pldmd分析(To be continued...)
  • Spark 集群搭建:Standalone 模式详解
  • 《Science》观点解读:AI无法创造真正的智能体(AI Agent)
  • 计算机网络学习笔记 1-3章
  • 判断符号??,?. ,! ,!! ,|| ,,?: 意思以及举例
  • 【Java面试题01】Spring经典面试题