学习新时代编程语言Rust-15再放里一条裤子

2024-01-22 18:50

本文主要是介绍学习新时代编程语言Rust-15再放里一条裤子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在上一期视频中我们学习了使用切片,使用了一个数组做为箱子存放小胖的裤子。小胖想把其他的裤子也放在这个箱子里。我们使用代码实现下。
  首先我们定义另一条裤子。然后使用push方法把裤子放入箱子。在这里输出下箱子里的裤子条数,如果这条裤子放进去了加上原来的5条裤子,箱子里应该有6条裤子了吧?我们运行看下是不是有6条裤子。
len
控制台输出了个错误,错误信息提示我们数组没有push方法。
error
那是不是方法名叫add呢?我们要不要试试用add方法?!我们这里就不试了,因为我们前面提到数组的容量是在创建的时候已经确定了的。就相当于我们使用数组做的箱子体积是不能变的。所以当箱子满了的时候,我们就不能再往里放东西了。也就没有在往里放东西的方法了。所以我们需要换个能变大的箱子,我们可以使用Vector。Vector是基于数组开发的可变长度的复合类型。由于它是基于数组开发的,所以数组有的功能它也有,我们只需要在创建箱子时添加vec宏,把数组箱子替换为Vector箱子就好了,其它代码不需要改动。
vec
我们再运行看下效果, 这次命令行里成功输出了”现在有6条裤子“。 
cargo run
有同学可能会问既然Vector是基于数组开发的,数组的容量是不可变的那Vector是怎么做到容量可变的呢。
Vector是通过创建容量更大的新数组替换原来的数组做到看上去容量可变。什么意思呢?! 比如我们现在创建了一个有俩个元素的Vector.那Vector底层就会创建一个长度为2的数组保存这两个元素,当我们再往数组里添加另一个元素时,Vector就会创建一个长一点的数组,我们比方新创建了一个长度为4的新数组。Vector会把原来数组里的俩个元素移动到新数组里然后把新添加的元素放到新数组里。
这样,我们在使用Vector时就觉得它的容量是可变的了。
由于频繁的创建数组移动数据比较消耗性能,所以当我们知道或者能够预估元素的个数时,我们可以使用Vector的with_capacity方法设定Vector 创建的的数组大小,这样Vector内部就不需要频繁创建数组移动数据了。接下来我们使用代码直观的感受下。
使用cargo new 创建一个vector-test项目,进入项目目录,使用文本编辑器打开main.rs文件,删除掉不需要的代码,使用vec宏创建一个包含俩个元素的Vector,再使用for循环往vector里放入从1到9的9个数字。每次放入前,输出下vector的长度和容量。方便我们观察vector内部的变化。长度和容量有什么关系呢?!长度指vector里已经包含的元素的个数,容量指vector里能够包含的元素个数。如果把vector比作一个装裤子的箱子,那容量就是箱子能够装的裤子条数,长度就是你实际往里放的裤子条数。

编写好后 我们运行看下效果。
  这里报了个错误,错误提示我们变量v是不可变的但我们却要改变它。我们忘记使用mut关键字了吧?我们添加mut关键字,再运行看下效果。
cargo run
这次运行成功了,从输出的结果我们可以看出:刚创建时Vector的长度和容量一样都是2, 因为我们在创建时就放里了俩个元素。当往里放了第三个元素后,长度和容量就不一样了,长度是3容量变成了4,这说明vector内部已经重新创建了个数组。随着往里放的元素越来越多,vector的容量也越来越大,从这里的2,4,8,16我们可以看出每次扩容都是增大了一倍。
接下来我们在使用with capacity方法创建一个Vector. 我们往里放从1到9 共9个元素所以我们设置容量为10当然设置为9也可以。我们再运行看下效果,这里提示找不到Vector,这是因为我们应该用简写vec而不应该用vector. 修改好后保存退出,再运行看下效果。
cargo run
这次输出的capacity都是10,也就是Vector内部没有发生频繁的创建数组移动数据。
大家可以自己复现下代码,感受一下。

内容根据视频整理,相应视频内容可访问

51cto学院:
51cto

免费进群交流

KeepLearning

Don’t let your history control your destiny.

这篇关于学习新时代编程语言Rust-15再放里一条裤子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/633906

相关文章

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

CSS Anchor Positioning重新定义锚点定位的时代来临(最新推荐)

《CSSAnchorPositioning重新定义锚点定位的时代来临(最新推荐)》CSSAnchorPositioning是一项仍在草案中的新特性,由Chrome125开始提供原生支持需... 目录 css Anchor Positioning:重新定义「锚定定位」的时代来了! 什么是 Anchor Pos

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

rust 中的 EBNF简介举例

《rust中的EBNF简介举例》:本文主要介绍rust中的EBNF简介举例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 什么是 EBNF?2. 核心概念3. EBNF 语法符号详解4. 如何阅读 EBNF 规则5. 示例示例 1:简单的电子邮件地址

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

WiFi6时代来临! 华三H3C NX54路由器还值得购买吗?

《WiFi6时代来临!华三H3CNX54路由器还值得购买吗?》WiFi6时代已经来临,众多路由器厂商也纷纷推出了兼容WiFi6协议的路由器,今天我们将深入体验H3CNX54路由器,这款由知名企业... 随着科技的发展,WiFi6逐渐走进了我们的日常生活之中,相比WiFi5来说,WiFi6拥有更高的带宽、更高