簡體   English   中英

將Vec <String>作為IntoIterator傳遞<&'a str>

[英]Passing Vec<String> as IntoIterator<&'a str>

我有一個函數應該從單詞列表中選擇隨機單詞:

pub fn random_words<'a, I, R>(rng: &mut R, n: usize, words: I) -> Vec<&'a str>
where
    I: IntoIterator<Item = &'a str>,
    R: rand::Rng,
{
    rand::sample(rng, words.into_iter(), n)
}

大概這是一個合理的簽名:因為我實際上並不需要函數中的字符串本身,所以處理引用比獲取完整的String更有效。

如何優雅高效地將Vec<String>與我的程序從文件中讀取的單詞傳遞給此函數? 我得到了這個:

extern crate rand;

fn main() {
    let mut rng = rand::thread_rng();
    let wordlist: Vec<String> = vec!["a".to_string(), "b".to_string()];

    let words = random_words(&mut rng, 4, wordlist.iter().map(|s| s.as_ref()));
}

這是正確的方法嗎? 我是否可以在沒有明確映射單詞列表的情況下編寫此代碼來獲取引用?

你可以改變你的泛型函數,把任何可以變成&str東西,而不是讓它得到一個產生&str的迭代器:

pub fn random_words<'a, I, R, J>(rng: &mut R, n: usize, words: I) -> Vec<&'a str>
where
    I: IntoIterator<Item = &'a J>,
    J: AsRef<str> + 'a,
    R: rand::Rng,
{
    rand::sample(rng, words.into_iter().map(AsRef::as_ref), n)
}
let words: Vec<&str> = random_words(&mut rng, 4, &wordlist);

本書甚至有一整章專門討論這個主題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM