iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0

在 Rust 中,我們可以透過泛型來定義值的屬性,雖然用法有限,不過有總比沒有好?那該怎麼做呢?

const 泛型

假設我們定義了一個方法,要把陣列裡的所有元素印出來

當我們在 arr 給足三個元素,這樣是沒問題的

fn main() {
    let arr = ["Amy", "Candy", "Hank"];
    my_friends(arr);
}

fn my_friends(arr: [&str; 3]) {
    println!("{:?}", arr);
}

但如果我今天少了一個朋友:( 要把他從朋友清單移除呢?

fn main() {
    let arr = ["Amy", "Candy"];
    my_friends(arr);
}

fn my_friends(arr: [&str; 3]) {
    println!("{:?}", arr);
}

可想而知,在編譯期間就噴錯了,他要的是 3 個元素,我們只給了 2 個

> cargo run

error[E0308]: mismatched types
 --> src/main.rs:3:16
  |
3 |     my_friends(arr);
  |     ---------- ^^^ expected an array with a fixed size of 3 elements, found one with 2 elements
  |     |
  |     arguments to this function are incorrect
  |
note: function defined here
 --> src/main.rs:6:4
  |
6 | fn my_friends(arr: [&str; 3]) {
  |    ^^^^^^^^^^ --------------

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

來看一下該怎麼解決

陣列切片

我們可以用陣列切片來解決這個問題,

陣列切片的意思就是,陣列的參考,可以表示整個陣列或子集

fn main() {
    let arr = ["Amy", "Candy"];
    my_friends(&arr);
}

fn my_friends<T: std::fmt::Debug>(arr: &[T]) {
    println!("{:?}", arr);
}
> cargo run

["Amy", "Candy"]

const

接下來我們要進入重頭戲了,看看怎麼讓值也是泛型

透過 const 我們可以來定義值的長度

usize 表示陣列的長度

arr: [T; N] 表示陣列的元素型別為泛型,長度為 N

而 const 後面不一定要加 N ,加任何單字或字母都可以

fn main() {
    let arr = ["Amy", "Candy"];
    my_friends(arr);
}

fn my_friends<T: std::fmt::Debug, const N: usize>(arr: [T; N]) {
    println!("{:?}", arr);
}
> cargo run

["Amy", "Candy"]

我們在上面舉了陣列的長度為例子,那泛型只能用在陣列的長度嗎?

其實還可以拿來定義值的型態,不過只能定義型別,不過只能定義數字類的型別、charbool 這幾種

跟一般常數定義的差異?

const 泛型跟一般我們在定義常數的 const 是不一樣用途的

  • 常數定義是為了定義編譯時已知的不可變值
  • const 泛型是為了在型別和 Function 中將參數以常數的方式帶入,在編譯的時候讓值更有彈性,無需寫死

上一篇
Day 25 - 泛型 part 1
下一篇
Day 27 - 輸出 part 1
系列文
成為程式界的 F1 賽車手,用 30 天認識 Rust 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言