我有一个应该从单词列表中选择随机单词的函数:
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)
}
大概这是一个合理的签名:由于我实际上在函数中不需要字符串本身,因此处理引用比获取full更有效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()));
}
那是正确的方法吗?我可以在不显式映射单词列表以获取参考的情况下编写此代码吗?
您可以将泛型函数更改为采用任何可以转换为a&str
的函数,而不是采用可以生成a的迭代器&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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句