[英]Why does std::vec::Vec implement two kinds of the Extend trait?
struct std::vec::Vec
实现了两种扩展,如这里所指定的 – impl<'a, T> Extend<&'a T> for Vec<T>
和impl<T> Extend<T> for Vec<T>
。 文档指出,第一种是“扩展实现,在将元素推送到 Vec 之前从引用中复制元素”。 我对 Rust 比较陌生,我不确定我是否正确理解它。
我猜第一种与 C++ 普通迭代器的等价物一起使用,第二种与 C++ 移动迭代器的等价物一起使用。
我正在尝试编写一个函数,该函数接受任何允许将i32
插入到后面的数据结构,所以我采用了一个实现这两种Extend
的参数,但我不知道如何指定通用参数来获取它工作:
fn main() {
let mut vec = std::vec::Vec::<i32>::new();
add_stuff(&mut vec);
}
fn add_stuff<'a, Rec: std::iter::Extend<i32> + std::iter::Extend<&'a i32>>(receiver: &mut Rec) {
let x = 1 + 4;
receiver.extend(&[x]);
}
编译器抱怨&[x]
“创建了一个在仍在使用时被释放的临时文件”,这是有道理的,因为'a
来自函数add_stuff
之外。 但当然我想要的是receiver.extend(&[x])
将元素从临时数组切片中复制出来并将其添加到容器的末尾,因此在receiver.extend
之后将不再使用临时数组返回。 表达我想要的东西的正确方式是什么?
从add_stuff
的外部, Rect
必须能够使用其生命周期在add_stuff
内部给出的引用进行扩展。 因此,您可以要求Rec
必须能够使用更高等级的特征边界使用任何生命周期的引用进行扩展:
fn main() {
let mut vec = std::vec::Vec::<i32>::new();
add_stuff(&mut vec);
}
fn add_stuff<Rec>(receiver: &mut Rec)
where
for<'a> Rec: std::iter::Extend<&'a i32>
{
let x = 1 + 4;
receiver.extend(&[x]);
}
此外,如您所见,特征边界过于严格。 如果您在add_stuff
始终使用receiver
其中之一就足够了。
也就是说,我只需要Extend<i32>
并确保add_stuff
在内部做正确的事情(如果可能):
fn add_stuff<Rec>(receiver: &mut Rec)
where
Rec: std::iter::Extend<i32>
{
let x = 1 + 4;
receiver.extend(std::iter::once(x));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.