我有一个函数,它应该从单词列表中随机选择单词:
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()));
}
这种方式正确吗?我能否不显式地遍历单词列表来获取引用而进行编写?
String
更有效,也许是这样,也许不是;这实际上更取决于您如何使用字符串。如果您稍后将&str
转换为String
并丢弃Vec<String>
,那么最好直接对String
进行采样。如果您确实需要对项目进行引用,我可能会编写类似于您的代码:rand::sample(rng, words.iter().map(AsRef::as_ref), 4)
。 - Shepmasterrandom_words
函数没有任何有用的作用,你应该直接使用rand::sample
。 - starblue