Javascript 映射在 2D 向量迭代器上的 Rust 等价物

Rust equivalent for a Javascript map over a 2D vector iterator

我是 Rust 的新手。我正在学习,通过尝试移植 Javascript 中显示的代码(在 https://youtu.be/oBt53YbR9Kk) to Rust. While trying to code the function shown at around https://youtu.be/oBt53YbR9Kk?t=10912 中,从第 4 行的 for 循环开始,我坚持使用 Rust,如下所示。

在第 8 行的 Javascript 中,我们有:

const targetWays = suffixWays.map(way => [word, ...way])

在 Rust 中,我试图将其写为:

let target_ways = suffix_ways.into_iter().map(|way| way.insert(0, word_bank[i].clone())).collect::<Vec<Vec<String>>>();

但是,我得到一个编译时错误

value of type `std::vec::Vec<std::vec::Vec<std::string::String>>` cannot be built from `std::iter::Iterator<Item=()>`

我做错了什么?

Vec::insert returns (),因为它只是就地修改了vec。所以闭包:|way| way.insert(0, word_bank[i].clone()) 的类型是 fn(Vec<String>) -> ().

相反,您可能想要这样的东西:

let target_ways: Vec<_> = suffix_ways.into_iter().map(|way| {
  way.insert(0, word_bank[i].clone());
  way
}).collect();

FWIW,插入到 Vec 的开头可能会非常昂贵,因为它会重新分配底层内存并复制所有元素。推到 vec 的末尾通常更便宜,如果必须的话,在最后反转。这一点尤其正确,因为您事先知道 vec 的大小(因此可以使用 Vec::with_capacity 创建它以提前一次性分配所有内存)。

尽管如果您只是在学习,请随意忽略它并继续构建一些很酷的东西:)

为了完整性,考虑到闭包必须 return 一些值并且不使用 VecDeque,这里是函数的代码。

fn all_construct(target: String, word_bank: &mut Vec<String>) -> Vec<Vec<String>> {
    if target.is_empty() {
        return vec![vec![]];
    }

    let mut result:Vec<Vec<String>> = Vec::new();

    for i in 0..word_bank.len() {
        let search = &word_bank[i];
        if target.starts_with(search) {
            let suffix = target.chars().skip(search.len()).collect();
            let mut suffix_ways = all_construct(suffix, word_bank);
            let target_ways:Vec<_> = suffix_ways.iter_mut().map(|way| {
                way.insert(0, word_bank[i].clone());
                way.clone()
            }).collect::<Vec<Vec<String>>>();
            result.extend(target_ways);
        }
    }

    result
}

随时提出改进建议。