将 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);
我有一个函数可以从单词列表中随机选择单词:
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);