🎃个人专栏:
🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客
🐳Java基础:Java基础_IT闫的博客-CSDN博客
🐋c语言:c语言_IT闫的博客-CSDN博客
🐟MySQL:数据结构_IT闫的博客-CSDN博客
🐠数据结构:数据结构_IT闫的博客-CSDN博客
💎C++:C++_IT闫的博客-CSDN博客
🥽C51单片机:C51单片机(STC89C516)_IT闫的博客-CSDN博客
💻基于HTML5的网页设计及应用:基于HTML5的网页设计及应用_IT闫的博客-CSDN博客
🥏python:python_IT闫的博客-CSDN博客
🐠离散数学:离散数学_IT闫的博客-CSDN博客
🥽Linux:Linux_Y小夜的博客-CSDN博客
🚝Rust:Rust_Y小夜的博客-CSDN博客
欢迎收看,希望对大家有用!
目录
学习推荐:
在当今这个飞速发展的信息时代,人工智能(AI)已经成为了一个不可或缺的技术力量,它正在逐步改变着我们的生活、工作乃至整个社会的运作方式。从智能语音助手到自动驾驶汽车,从精准医疗到智慧城市,人工智能的应用已经渗透到了我们生活的方方面面。因此,学习和掌握人工智能相关的知识和技能,对于任何希望在这个时代保持竞争力的个人来说,都已经变得至关重要。
然而,人工智能是一个涉及数学、计算机科学、数据科学、机器学习、神经网络等多个领域的交叉学科,其学习曲线相对陡峭,对初学者来说可能会有一定的挑战性。幸运的是,随着互联网教育资源的丰富,现在有大量优秀的在线平台和网站提供了丰富的人工智能学习材料,包括视频教程、互动课程、实战项目等,这些资源无疑为学习者打开了一扇通往人工智能世界的大门。
前些天发现了一个巨牛的人工智能学习网站:前言 – 人工智能教程通俗易懂,风趣幽默,忍不住分享一下给大家。
第一个类型是
Vec<T>
,也被称为 vector:
- 有标准库提供。
- 允许我们在一个单独的数据结构中储存多于一个的值。
- 它在内存中彼此相邻地排列所有的值。
- vector 只能储存相同类型的值。
🎯创建vector
为了创建一个新的空 vector,可以调用
Vec::new
函数let v: Vec<i32> = Vec::new();
因为没有向这个 vector 中插入任何值,Rust 并不知道我们想要储存什么类型的元素。这是一个非常重要的点。vector 是用泛型实现的。
为了方便 Rust 提供了
vec!
宏,这个宏会根据我们提供的值来创建一个新的 vector。let v = vec![1, 2, 3];
因为我们提供了
i32
类型的初始值,Rust 可以推断出v
的类型是Vec<i32>
,因此类型注解就不是必须的。接下来让我们看看如何修改一个 vector。
🎯更新Vector
对于新建一个 vector 并向其增加元素,可以使用
push
方法let mut v = Vec::new(); v.push(5); v.push(6); v.push(7); v.push(8);
如果想要能够改变它的值,必须使用
mut
关键字使其可变。放入其中的所有值都是i32
类型的,而且 Rust 也根据数据做出如此判断,所以不需要Vec<i32>
注解。
🎯删除Vector
类似于任何其他的
struct
,vector 在其离开作用域时会被释放{ let v = vec![1, 2, 3, 4]; }
🎯读取Vector元素
有两种方法引用 vector 中储存的值:
- 通过索引
- 使用
get
方法。let v = vec![1, 2, 3, 4, 5]; let third: &i32 = &v[2]; println!("The third element is {third}"); let third: Option<&i32> = v.get(2); match third { Some(third) => println!("The third element is {third}"), None => println!("There is no third element."), }
这里有几个细节需要注意:
- 我们使用索引值
2
来获取第三个元素,因为索引是从数字 0 开始的。- 使用
&
和[]
会得到一个索引位置元素的引用。- 当使用索引作为参数调用
get
方法时,会得到一个可以用于match
的Option<&T>
。let v = vec![1, 2, 3, 4, 5]; let does_not_exist = &v[100]; let does_not_exist = v.get(100);
当运行这段代码,你会发现对于第一个
[]
方法,当引用一个不存在的元素时 Rust 会造成 panic。这个方法更适合当程序认为尝试访问超过 vector 结尾的元素是一个严重错误的情况,这时应该使程序崩溃。当
get
方法被传递了一个数组外的索引时,它不会 panic 而是返回None
。当偶尔出现超过 vector 范围的访问属于正常情况的时候可以考虑使用它。接着你的代码可以有处理Some(&element)
或None
的逻辑。
🎯所有权和借用规则
不能在相同作用域中同时存在可变和不可变引用。
let mut v = vec![1, 2, 3, 4, 5]; let first = &v[0]; v.push(6); println!("The first element is: {first}");
当我们获取了 vector 的第一个元素的不可变引用并尝试在 vector 末尾增加一个元素的时候,如果尝试在函数的后面引用这个元素是行不通的。
🎯遍历Vector中的值
使用
for
循环来获取i32
值的 vector 中的每一个元素的不可变引用并将其打印let v = vec![100, 32, 57]; for i in &v { println!("{i}"); }
我们也可以遍历可变 vector 的每一个元素的可变引用以便能改变它们:
let mut v = vec![100, 32, 57]; for i in &mut v { *i += 50; }
🎯使用enum来存储多种数据类型
vector 只能储存相同类型的值。这是很不方便的;绝对会有需要储存一系列不同类型的值的用例。幸运的是,枚举的成员都被定义为相同的枚举类型,所以当需要在 vector 中储存不同类型值时,我们可以定义并使用一个枚举!
enum SpreadsheetCell { Int(i32), Float(f64), Text(String), } let row = vec![ SpreadsheetCell::Int(3), SpreadsheetCell::Text(String::from("blue")), SpreadsheetCell::Float(10.12), ];
Rust 在编译时就必须准确的知道 vector 中类型的原因在于它需要知道储存每个元素到底需要多少内存。第二个好处是可以准确的知道这个 vector 中允许什么类型。如果 Rust 允许 vector 存放任意类型,那么当对 vector 元素执行操作时一个或多个类型的值就有可能会造成错误。