Co

Collect 属于 Rust

{other: "%{count} 个练习"}

关于 Collect

要理解collect函数,重要的是知道它用于求出迭代器的结果。回想一下,迭代器是一系列项,可以和其他迭代器链接起来。迭代器是_惰性_的,这意味着在你调用消费迭代器的代码之前,它们不会执行。这类代码包括for循环和消费型适配器。消费型适配器会处理迭代器中的所有项,产生某种输出。

collect就是这样一种消费型适配器,可以用来生成任何实现了 FromIterator特征 的类型的实例。标准库中的所有集合都实现了这个特征。因为许多类型都实现了FromIterator,所以你需要让 Rust 知道你想要哪种集合。例如,如果我们想从一个字符串切片得到一个Vec<char>,可以在调用collect时把类型写进去,就像这样

    let my_chars = "Hello, World!".chars().collect::<Vec<char>>();
// since the item type of the `String::chars()` iterator can be inferred to be `char`, we can omit that information
// let my_chars = "Hello, World!".chars().collect::<Vec<_>>();

双冒号和外侧的尖括号(即::<_>)被称为turbofish。在这种情况下,turbofish 的语法比我们需要的更啰嗦。通过在绑定本身指定类型,collect就能在语法上更简洁地推断出应该创建哪种集合。

    let my_chars: Vec<char> = "Hello, World!".chars().collect();
// or
// let my_chars: Vec<_> = "Hello, World!".chars().collect();

如果我们想要一个字符顺序反转的String,可以这样做

    let rev_chars: String = "Hello, World!".chars().rev().collect();

Rust 的类型推断足够强大,有时候我们并不需要显式地写上类型标注:

fn get_reversed_chars(phrase: &str) -> Vec<char> {
    phrase.chars().rev().collect()
}

get_reversed_chars函数的返回类型让collect函数能够推断出应该返回哪种集合。不过在这里,我们必须指定Vec<char>而不是Vec<_>,因为 Rust 不会对函数签名进行类型推断。这样做是为了确保阅读代码的人能快速知道一个函数接收和返回什么类型。

通过 GitHub 编辑 该链接会在新窗口或标签页中打开