请考虑以下代码:
trait Trait<T> {}
fn foo<'a>(_b: Box<dyn Trait<&'a usize>>) {}
fn bar(_b: Box<dyn for<'a> Trait<&'a usize>>) {}
Run Code Online (Sandbox Code Playgroud)
这两个函数foo和bar似乎接受Box<Trait<&'a usize>>,虽然foo比更简明做它bar.他们之间有什么区别?
另外,在什么情况下我需要for<>像上面那样的语法?我知道Rust标准库在内部使用它(通常与闭包有关),但为什么我的代码需要它呢?
是否准确地说明一个向量(以及其他集合类型)是一个Iterator?
例如,我可以通过以下方式循环遍历向量,因为它实现了Iterator特征(据我所知):
let v = vec![1, 2, 3, 4, 5];
for x in &v {
println!("{}", x);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我想使用属于Iterator特征的函数(例如fold,map或filter),为什么我必须首先调用iter()该向量?
我的另一个想法是,可能会将矢量转换为a Iterator,在这种情况下,上面的语法更有意义.
我正在编写一个以通用方式实现前缀树的容器(键和值是通用参数).由于这个数据结构的性质,我需要密钥来拥有一个迭代器.
基本上根据这个问题,IntoIterator特征是造成这种可能性的原因,但并非所有结构都能实现它.例如&str,String不要实现它.
在这种情况下,如果IntoIterator标准类型没有实现,我该怎么办?
预期的API是
let mut t1 = Trie::new();
t1.insert(String::from("this"), 1);
let mut t2 = Trie::new();
t2.insert(vec![1, 2, 3], 1);
Run Code Online (Sandbox Code Playgroud)