我是 Rust 的新手。我正在學習,通過嘗試將 Javascript(在https://youtu.be/oBt53YbR9Kk中)中顯示的代碼移植到 Rust。在嘗試從第 4 行的 for 回圈開始對https://youtu.be/oBt53YbR9Kk?t=10912附近顯示的函式進行編碼時,我被 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=()>`
我究竟做錯了什么?
uj5u.com熱心網友回復:
Vec::insert回傳(),因為它只是簡單地修改了 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,插入到 a 的開頭Vec可能會非常昂貴,因為它會重新分配底層記憶體并復制所有元素。推到 vec 的末尾通常更便宜,如果必須的話,可以在末尾反轉。尤其如此,您提前知道 vec 的大小(因此可以創建它以Vec::with_capacity提前一次性分配所有記憶體)。
雖然如果你只是在學習,請隨意忽略這一點,繼續構建一些很酷的東西:)
uj5u.com熱心網友回復:
為了完整起見,考慮到閉包必須回傳一些值而不使用 using 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
}
隨時提出改進建議。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/449224.html
