服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - 编程技术 - Rust那些事之Vector妙用

Rust那些事之Vector妙用

2022-10-26 19:53光城lightcity 编程技术

这篇文章主要为大家分享Rust那些事之Vector妙用,对于学习rust非常有帮助,有需要的朋友可以参考下

导语

我们知道vector是一个动态数组,在C++中来说,vector中存储的只能是一种类型,那如何做到存储多个,无非就是包一层,例如:结构体、void*。而在Rust中enum非常独特,每个值可以是不同类型,因此我们从enum来考虑。另一方面,几种不同的方式从vector中读取有何不同呢?

1.vector实例

例如:一个enum包含了不同类型

#[derive(Debug)] enum Spec { Int(i32), Float(f64), Bool(bool), Text(String), }

调用:

pub fn mult_type() { let r = vec![Spec::Int(1), Spec::Float(2.2), Spec::Bool(true), Spec::Text(String::from("hello"))]; println!("{:?}", r) }

这样便可以简单的完成一个vector使用不同类型。

2.&实例

vector中,你可以取其中的元素,有下面几个方法:

v[2] &v[2] v.get(2)

这三个有什么区别?

前两个很明显,跟传统的获取元素一致,如果下标越界,便会panic,而get使用了Option特殊枚举,在越界情况下会返回None,不会panic,足以说明Rust的安全性。

因为v.get返回的是Option,我们可以使用match控制流,提取出包裹的内容。

match v.get(2) { Some(x) => println!("{}", x), None => println!("None") }

接下来,我们考虑v[2]与&v[2]的区别。

// case1: & let mut v = vec![1, 2, 3, 4, 5]; let first = &v[0]; v.push(6); println!("The first element is: {}", first); // case2: plain
let mut v = vec![1, 2, 3, 4, 5]; let first = v[0]; v.push(6); println!("The first element is: {}", first);

考虑上述两个case,在push的时候哪个case是正常的?

答案是第二个case会正常运行,第一个case由于&的影响,会报错。

在 vector 的结尾增加新元素时,在没有足够空间将所有元素依次相邻存放的情况下,可能会要求分配新内存并将老的元素拷贝到新的空间中。这时,第一个元素的引用就指向了被释放的内存。借用规则阻止程序陷入这种状况。

此时便会报错:error: cannot borrow v as mutable because it is also borrowed as immutable。

原文地址:https://mp.weixin.qq.com/s/PK2qFaR5-84lc3-TL48XRQ

延伸 · 阅读

精彩推荐
  • 编程技术仅仅使用 HTML/CSS 实现进度条的 N 种方式

    仅仅使用 HTML/CSS 实现进度条的 N 种方式

    本文将介绍如何使用 HTML/CSS 创建各种基础进度条及花式进度条及其动画的方式,进度条,是我们日常界面中使用的非常多的一种,下面我们来看看。...

    iCSS前端趣闻10742021-11-02
  • 编程技术Rust 能够取代 C 语言吗

    Rust 能够取代 C 语言吗

    Rust 是 Mozilla 基金会的一个雄心勃勃的项目,号称是 C 语言和 C++ 的继任者,这篇文章主要介绍了Rust 能够取代 C 语言吗的相关知识,需要的朋友可以参考下...

    TGeek5152020-06-30
  • 编程技术一起学习Wireshark-1.1.3(数据包抓取)

    一起学习Wireshark-1.1.3(数据包抓取)

    本文主要为大家以Wireshark为例介绍wireshark抓包技术的使用方法,之前介绍完wireshark软件菜单栏地Edit,Files/Views本次继续介绍菜单Capture。有需要的朋友可以参...

    今日头条3512020-12-18
  • 编程技术声音验证码制作方法

    声音验证码制作方法

    收听验证码已经比较普遍了,使用户看不清楚的情况下可以通过耳朵来收听验证码,但网上搜了很久没看到有具体的制作方法,自己想了想,还是按自己的...

    编程之家3952020-07-15
  • 编程技术大数据行业人才真的供大于求了吗?

    大数据行业人才真的供大于求了吗?

    大数据这个行业人才需求量在不断扩大,所以随之而来的便是进入这个行业的人数比在不断增多。但是一个行业的发展规律都往往是当市场的需求不断加大...

    今日头条7082021-03-09
  • 编程技术快来看看这是你心目中比较好的5种编程语言吗?

    快来看看这是你心目中比较好的5种编程语言吗?

    无论您是想成为Web设计人员,游戏开发人员,机器学习爱好者,还是任何其他相关技术领域,都需要一件最常见,最重要的事情。是的,您猜对了-编程语言...

    今日头条4182020-12-26
  • 编程技术详解IDEA git分支回退指定的历史版本

    详解IDEA git分支回退指定的历史版本

    这篇文章主要介绍了详解IDEA git分支回退指定的历史版本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋...

    LZ115122610532020-08-30
  • 编程技术在DevOps中整合“安全即代码”文化

    在DevOps中整合“安全即代码”文化

    最近,DevOps的采用导致了企业计算的重大转变。除无服务器计算,动态配置和即付即用成本模型之类的功能外,DevOps的实践对于组织可以发挥一些增值效益...

    DevOps云学堂10912020-12-30