[Day6] Vector 使用 以及 回圈更深应用

今天的内容可能有点杂 进度好慢 zzzz

昨天讲到 for loop
但是正常人都不会只是像昨天那样操作
所以先来讲讲阵列
let a = [1, 2, 3, 4, 5];
这样就是一个长度为 5 的阵列
如果只是要初期定义的话可以这样写
let a :[i32; 1];
前面的是型态後面则是空间
或者说 要用某个变数填满他就直接
let a = [5, 1];
创建大小为 1 并且元素皆为 5 的阵列
那这都只是前菜
大部分人(应该)也可以说我,都没在用阵列的拉
都是直接用 Vector 因为可以动态分配大小,取值的使用又比较方便。
定义如下:
let mut vec = Vec::new();
或者是也可以初始化
let vec2 = Vec::from([1, 2, 3, 4]);
let vec = vec![1, 2, 3, 4];
当然 空间也是可以初始化的
let vec = vec![0; 5];
let vec![0, 0, 0, 0, 0];

那麽以下也是方法,只是较慢 不推荐使用
let mut vec = Vec::with_capacity(5);
vec.resize(5, 0);
至於 Vector 本身除了像 阵列一样使用还可以干麻呢
「动态分配空间」
就像 C++ 一样 使用 push / push_front 即可将要传入的东西弄到 Vec! 的最尾端 / 最前端
但是这个 Vec 也可以像 stack 一样取出 top 只要 .top() 就有了
pop 也是把最尾端的丢掉。
那可以延续前面所讲的 for loop
可以直接使用 for <AnyName> in <Vector>
这样得出的结果就类似於使用 C++ 里面的

for(auto i: vec)

这样的感觉
来遍历所有存在 Vector 中的东西
.enumerate()加在回圈後面可使回圈的第一个变数为他执行的次数(记数)
ex

for (cnt, index) in vec.iter().enumerate(){

}

这样可以轻松的构造出一个带编号的 for loop 回圈
但是问题是
是的 的确能够正常运行

let a = Vec::from([1, 2, 3]);
for i in a {
    println!("{}", i);
}

但是当重新使用此 Vec 时就会发现由於在 for loop 中 a 的使用权已经被 move 掉了所以无法使用
该怎麽解决?
这时候就要用到之前所讲的所有权
clone 一个在回圈使用时
或者是也可以利用之前稍微提及的"所有权"
& 在 Rust 中意味着借用
这样讲可能没有这麽好理解

let a = Vec::from([1, 2, 3]);
for i in &a {
    println!("{}", i);
}
println("{}", a[0]);

会发现 他奇蹟的成功了。
因为在 for 回圈以後就直接将所有权回收回来了。
就不会遇到说後面想要使用时,却无法使用的问题。
那麽当然,不只是只能用在阵列之中,函数同样是行得通的
以下是函数的范例

pub fn test(s : &String) {
    println!("{:#}", s);
}

传入则为

pub fn fn_test() {
    let s = String::from("owo");
    test(&s);
}

那但是 像上面这样借用出去是可变得吗?
答案是 不是
其实只要在参数前面加一个 mut 即改为可变 同样以上面的为范例

pub fn test(s : &mut String) {
    println!("{:#}", s);
}

传入则为

pub fn fn_test() {
    let mut s = String::from("owo");
    test(&mut s);
}

但是要记得一点,在定义要传入的参数时,该参数就应该为 可变 了。
那需要记得的是 回圈的范围中所定义出的变数在结束回圈後就会回收,也就是该变数的周期到此为止。
之後如果有机会的话在更新有关生命周期,因为其实我不太熟,主要是生命周期标记的部份。
还有什麽,也是能像 回圈那样弄出一个范围呢?
在 Rust 中恰巧就有两个:if let 跟 while let
使用范例如下

let a = String::from("123");
if let Some(s) = a {
    println!("{:?}", s); // a 被传递给 s 所以後面不能出现 a 了
}

while let 则是

let mut a = Some(0)
while let Some(i) = a {
    if(i > 5) break;
    else {
        i += 1;
    }
}

那到这里可能就要发问了 Some 是什麽
原本我打算到後面再讲 但既然提到了 就来说说吧
Option 这个就是 Rust 用来确保是否有检查他是 null / none 所开发出来的一个。
而使用 Some 时就是使用他 "确定有值" 的情况。 能够避免空指标的出现。
也就是在使用後,先做判断在确定要不要让他跑下一步。

那这边来一道练习题
Two Sum

impl Solution {
    pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
        let mut ans: Vec<i32> = Vec::new();
        for (i, num1) in nums.iter().enumerate(){
            for (j, num2) in nums.iter().enumerate(){
                if i == j { continue; }
                if (num1 + num2 == target){
                    ans.push(i as i32);
                    ans.push(j as i32);
                    return ans;
                }
            }
        }
        ans
    }
}

以上 就是今天的内容 有任何问题请提问
可能讲述的内容中有些错误,也能够直接纠正 我会虚心接受的!


<<:  食谱搜寻系统开赛罗~~

>>:  很好用的 Excel截图功能

初探编码的世界,Ruby 30 天刷题修行篇第六话

大家好,我是 A Fei,今天是连假最後一天,虽然正在忙转职根本没有放假的感觉,但看到手机里亲友们一...

唤醒与生俱来的数学力 (2) 顺序 & 因果

由於昨天晚上听了明就仁波切的分享,今天原本想读 In Love with the World,但读了...

[Day26] VSCode Plugin - Edge Tools<未完>

Show the browser's Elements and Network tool insi...

【RPA应用实例-文件类】SmartOCR + UiPath 打造文件处理流程自动化

一、认识RPA之後,最想处理文件类型的自动化 已经研究了解RPA基本概念与逻辑的企业,接下来都会开始...

创建App-(老师版)功能

创建App-(老师版)功能 今天来建设老师版的功能,授课时间与教课纪录。今天来弄弄成授课时间的页面,...