iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0
Software Development

Rust的多方面運用系列 第 5

[Day5] 變數&&部份所有權&&簡單的迴圈

  • 分享至 

  • xImage
  •  

不知不覺就寫了 1 / 6 了,時間也過太快了。
雖然我怕之後斷掉 QQ 想必讀者全部都會略過這一塊吧 讀的人有點少有點小失落。
不過還是盡快開始今天的內容吧!


在 Rust 中預設的變數都是不可變的
Ex:

let owo = 5;

如果說去改變的話則會報錯
所以如果要定義一個可變的變數的話記得增加 mut 來讓編譯器知道你的數值是會變動的
那以上面 owo 的例子來看,他已經把整數的型式自動套上你的變數了。那如果說想要直接定義型別的話要這樣寫

let mut owo: i32 = 5;

可以看到在上方的範例中我增加了他的型別以及設定他是可變的。
而在 Rust 中使用的型別不是像是 C 一樣寫個 int 或 long 或 double 而是
像是 i32, i16, i8, f32, u64 這樣

let mut a: i8 = 5;

這樣講應該怎麼以此類推也知道了。
喔對 Rust 在審查他的變數時極其嚴格,你是不能直接做兩個型別的操作的,什麼意思?
那我會在這邊提及一些所有權的概念
這邊真的有一點難講 所以這邊大部分會用 Code 來講解

    fn main() {
        let a: i8 = 5;
        let b = a;
        println!("{}", a); //Error 
    }

那為什麼會報錯 因為 b 把 a 的所有權拿走了
也就是代表說類似於 a 被改名為 b

圖片手繪不要嗆我QQ
初始定義如圖所寫

那當今天 B 指向了 A 的記憶體位置 如果 B 改變了數值 請問 A 是否也要更動呢?
因此 Rust 的編譯器會去管控不能出現此狀況所以會把 A 跟該記憶體位置的連結斷開

這個會是最後的結果
那如果真的很想要在所有權交給 B 之後繼續使用 A 的話 可以這樣寫

fn main(){
    let a: i8 = 5;
    let b = a.clone();
    println!({}, a); //AC
}


如圖所示


那麼以上是變數的部份
來講一下迴圈吧!
一如既往,相信有寫過程式的人都知道 for loop 吧

pub fn L() {
    for i in 1..5 {
        println!("{}", i);
    }
}

output

這樣也就是類似於

void L() {
    for (int i = 1; i < 5; i++) {
        std::cout << i << '\n';
    }
}

在 Rust 中呢 還有 單純名為 loop 的迴圈
Q:這個能幹麻呢?
A:當作迴圈
老實說我真的不知道該怎麼講 就真的,只是迴圈

loop{

}

就類似於 while (1) 這樣的感覺
雖然已經有 loop 了 但是還是保留了 while 用法跟 C / C++蠻像的

while i < 5 {}

這樣的感覺,由於過度簡單,就不多贅述了

然後講個小技巧
迴圈可以"被命名"
並且可以使用continue指定跳的位置
Ex:

'outer: for x in 0..10 {
    'inner: for y in 0..10 {
        if x % 2 == 0 { continue 'outer; }
        if y % 2 == 0 { continue 'inner; }
        println!("x: {}, y: {}", x, y);
    }
}

^
這樣會讓他的continue直接加到他所指定的數值

可能看到這裡,有些人覺得,欸欸 你迴圈也太水了吧!
是 沒錯,我承認。但是這是因為我打算明天講 Vec! 跟 陣列 時講深入
要不然我寫這篇前沒想到會把 迴圈一起抓出來講
但是說實話,速度是有點慢沒錯 該加速了,希望能成功完賽 owob
喔對,如果對於上面所有權有任何問題的可以直接提出。
現在還不了解是正常的,後面會獨立出一天來講,主要是講的東西還太少了。


上一篇
[Day4] Rust 閉包以及判斷式
下一篇
[Day6] Vector 使用 以及 迴圈更深應用
系列文
Rust的多方面運用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言