我的目标是编写一个如下所示的函数:
#[derive(Clone)]
struct Q{}
fn extending_function<A: Extend<Q>>(out: &mut A) {
let p = Q{};
out.extend(&[p]);
}
Vec
表示Extend
,因此由于我可以编写以下代码:
fn extending_function_vec(out: &mut Vec<Q>) {
let p = Q{};
out.extend(vec![p].into_iter());
}
或
#[derive(Copy, Clone)]
struct Q{}
fn extending_function_vec(out: &mut Vec<Q>) {
let p = Q{};
out.extend(&[p]);
}
尽管这里也是,但我有一个小问题:要么 Q必须是复制的,否则我必须将其粘贴到vec
中。
但是,当我尝试将其通用时,使它起作用的唯一方法是使我的代码看起来像这样:
#[derive(Copy, Clone)]
struct Q{}
fn extending_function<A: Extend<Q>>(out: &mut A) {
let p = Q{};
out.extend(vec![p].into_iter());
}
我必须都使用vec
复制Q。
问题是:
Q
必须为Copy
。即使我尝试out.extend(vec![Q{}].into_iter().cloned());
,也会收到语法错误。vec
中。有没有办法从静态数组扩展?答案 0 :(得分:1)
Extend
特性使您可以传递实现IntoIterator
的任何类型(包括任何迭代器)。
单个值的最简单迭代器是std::iter::once(value)
,它将恰好产生一次该值。它还将移动值(就像Vec::into_iter
一样),因此您不需要将类型设置为Copy
或Clone
。因此,使用单个值扩展的最简单方法是:
#[derive(Clone)]
struct Q{}
fn extending_function<A: Extend<Q>>(out: &mut A) {
let p = Q{};
out.extend(std::iter::once(p));
}