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
}
随时提出改进建议。
我是 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
}
随时提出改进建议。