lun*_*orn 4 string iterator reference rust borrowing
我有一个函数应该从单词列表中选择随机单词:
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)
}
Run Code Online (Sandbox Code Playgroud)
据推测这是一个合理的签名:因为我实际上并不需要函数中的字符串本身,所以处理引用比完全使用更有效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()));
}
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?我是否可以在没有明确映射单词列表的情况下编写此代码来获取引用?
您可以更改您的泛型函数以获取可以转换为a的任何内容,&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)
}
Run Code Online (Sandbox Code Playgroud)
let words: Vec<&str> = random_words(&mut rng, 4, &wordlist);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
466 次 |
最近记录: |