在 Rust 中,我們可以透過泛型來定義值的屬性,雖然用法有限,不過有總比沒有好?那該怎麼做呢?
假設我們定義了一個方法,要把陣列裡的所有元素印出來
當我們在 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
我們可以來定義值的長度
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"]
我們在上面舉了陣列的長度為例子,那泛型只能用在陣列的長度嗎?
其實還可以拿來定義值的型態,不過只能定義型別,不過只能定義數字類的型別、char
、bool
這幾種
const 泛型
跟一般我們在定義常數的 const
是不一樣用途的