集合类型

Rust有很多类型用于创建集合。当你需要在一个地方有多个值时,就可以使用集合。例如,你可以在一个变量中包含你所在国家的所有城市的信息。我们先从数组开始,数组的速度最快,但功能也最少。它们在这方面有点像&str

数组

数组是方括号内的数据。[]. 数组:

  • 不能改变其大小。
  • 必须只包含相同的类型。

但是,它们的速度非常快。

数组的类型是:[type; number]。例如,["One", "Two"]的类型是[&str; 2]。这意味着,即使这两个数组也有不同的类型。

fn main() {
    let array1 = ["One", "Two"]; // This one is type [&str; 2]
    let array2 = ["One", "Two", "Five"]; // But this one is type [&str; 3]. Different type!
}

这里有一个很好的提示:要想知道一个变量的类型,你可以通过给编译器下坏指令来 "询问"它。比如说

fn main() {
    let seasons = ["Spring", "Summer", "Autumn", "Winter"];
    let seasons2 = ["Spring", "Summer", "Fall", "Autumn", "Winter"];
    seasons.ddd(); // ⚠️
    seasons2.thd(); // ⚠️ as well
}

编译器说:"什么?seasons没有.ddd()的方法,seasons2也没有.thd()的方法!!"你可以看到:

error[E0599]: no method named `ddd` found for array `[&str; 4]` in the current scope
 --> src\main.rs:4:13
  |
4 |     seasons.ddd(); // 
  |             ^^^ method not found in `[&str; 4]`

error[E0599]: no method named `thd` found for array `[&str; 5]` in the current scope
 --> src\main.rs:5:14
  |
5 |     seasons2.thd(); // 
  |              ^^^ method not found in `[&str; 5]`

所以它告诉你method not found in `[&str; 4]`,这就是类型。

如果你想要一个数值都一样的数组,你可以这样声明。

fn main() {
    let my_array = ["a"; 10];
    println!("{:?}", my_array);
}

这样就打印出了["a", "a", "a", "a", "a", "a", "a", "a", "a", "a"]

这个方法经常用来创建缓冲区。例如,let mut buffer = [0; 640]创建一个640个零的数组。然后我们可以将零改为其他数字,以便添加数据。

你可以用[]来索引(获取)数组中的条目。第一个条目是[0],第二个是[1],以此类推。

fn main() {
    let my_numbers = [0, 10, -20];
    println!("{}", my_numbers[1]); // prints 10
}

你可以得到一个数组的一个片断(一块)。首先你需要一个&,因为编译器不知道大小。然后你可以使用..来显示范围。

例如,让我们使用这个数组。[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].

fn main() {
    let array_of_ten = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

    let three_to_five = &array_of_ten[2..5];
    let start_at_two = &array_of_ten[1..];
    let end_at_five = &array_of_ten[..5];
    let everything = &array_of_ten[..];

    println!("Three to five: {:?}, start at two: {:?}, end at five: {:?}, everything: {:?}", three_to_five, start_at_two, end_at_five, everything);
}

记住这一点。

  • 索引号从0开始(不是1)
  • 索引范围是不包含的(不包括最后一个数字)。

所以[0..2]是指第一个指数和第二个指数(0和1)。或者你也可以称它为 "零点和第一"指数。它没有第三项,也就是索引2。

你也可以有一个包含的范围,这意味着它也包括最后一个数字。要做到这一点。 添加=,写成..=,而不是..。所以,如果你想要第一项、第二项和第三项,可以写成[0..=2],而不是[0..2]