iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0
自我挑戰組

嘗試30天學「不」會Rust系列 第 3

[Rust] 靜態陣列與Tuple

  • 分享至 

  • xImage
  •  

環境

OS: Windows 10
Editor: Visual Studio Code
Rust version: 1.63.0

Continue...

關於昨天的基本型別的學習資料,下面還有一部分在描寫靜態陣列(static array)與元組型別(tuple) 的,今天繼續下去昨天還沒看完的部分。

靜態陣列

先從靜態陣列開始,也就是固定大小的陣列,對於陣列,根據我之前「碰過」,對!是碰過不是學過,碰過其他程式語言的經驗,對於靜態陣列會想知道幾件事:

  1. 怎麼宣告
  2. 怎麼給予預設值
  3. 怎麼知道陣列大小
  4. 怎麼宣告同時,統一預設值
  5. 二維陣列怎麼宣告和初始化

怎麼宣告與給予預設值

// 讓compiler知道自己的型別跟大小
let arr = [1, 2, 3, 4, 5];

// 讓我們告訴compiler型別跟大小
let mut arr1: [i32; 5]; // #2

// 讓我們告訴compiler型別跟大小,以及內部資料
let arr2: [i32; 5] = [1, 2, 3, 4, 5];

好奇上面第二個宣告方式,他是會編譯過的,但會回Warning,Rust是否會給予初始值?把其中一個索引值輸出出來看看:

let mut arr1: [i32; 5];
println!("Third element is {}", arr1[2]);

最後Compiler告訴我們error,這是為初始化的陣列:

Compiling basic v0.1.0 (D:\projects\rust_learning\basic)
error[E0381]: use of possibly-uninitialized variable: `arr1`
 --> src\main.rs:4:37
  |
4 |     println!("Third element is {}", arr1[2]);
  |                                     ^^^^^^^ use of possibly-uninitialized `arr1`

For more information about this error, try `rustc --explain E0381`.

如果用這樣的方式初始化呢?

let mut arr1: [i32; 5];
arr1[0] = 3;
arr1[1] = 3;
arr1[2] = 3;
arr1[3] = 3;
arr1[4] = 3;
println!("Third element is {}", arr1[2]);

答案還是一樣,compiler會跟我抱怨沒有初始化

warning: variable does not need to be mutable
 --> src/main.rs:2:9
  |
2 |     let mut arr1: [i32; 5];
  |         ----^^^^
  |         |
  |         help: remove this `mut`
  |
  = note: `#[warn(unused_mut)]` on by default

error[E0381]: use of possibly-uninitialized variable: `arr1`
 --> src/main.rs:3:5
  |
3 |     arr1[0] = 3;
  |     ^^^^^^^ use of possibly-uninitialized `arr1`

For more information about this error, try `rustc --explain E0381`.

怎麼知道陣列大小

let arr_sz = arr3.len();

怎麼宣告同時,統一預設值

// 下面兩個是一樣的意思

let arr4 = [3;5]; // [3, 3, 3, 3, 3]

let arr5: [i32; 5] = [3; 5]; // [3, 3, 3, 3, 3]

二維陣列怎麼宣告和初始化

假如我需要一個$4 \times 4$的矩陣,為單位矩陣:

let mut mat: [[f64; 4]; 4] = [[0.0; 4]; 4];
mat[0][0] = 1.0;
mat[1][1] = 1.0;
mat[2][2] = 1.0;
mat[3][3] = 1.0;

// PS: 這裡直接先拿範例的code來用
// 明天才會開始學習rust的control flow statements怎麼用
for (i, row) in mat.iter().enumerate() {
    for (j, col) in row.iter().enumerate() {
        println!("[row={}][col={}]={}", i, j, col);
    }
}

最後輸出出來看結果是不是預期的那樣。
範例來自這裡

Tuple

Tuple的用法是這樣:

let tup: (f64, bool, i32) = (0.27, false, 129);

解構(destructing)的話會長這樣:

let (x, y, z) = tup;

xyz分別輸出出來就會是0.27false129

要取得特定位置的話,根據下面範例,可以索引出0~2的元素:

let tup: (f64, bool, i32) = (0.27, false, 129);
// 取得index = 1 的值
let second = tup.1;
println!("Value is {}", second);

/*
 * output:
 *  Value is false
 */

這個讓我想到了Tuple能用的情境,可能像Golang一樣,在function中,可以一次回傳多個值。

下面是我上面指的Golang寫法:

// 同時回傳一個int跟錯誤型別
func (v0, v1 int) (int, error) {
    // do something
    
    return 0, nil
}

Reference


上一篇
[Rust] 變數與基本型別
下一篇
[Rust] 控制流程 (Control flow)
系列文
嘗試30天學「不」會Rust18
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言