有没有办法编写一个泛型函数,通过 rust 中的数组扩展实体?



我的目标是编写一个看起来像这样的函数:

#[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 副本。

问题是:

  1. Q必须Copy.即使我尝试out.extend(vec![Q{}].into_iter().cloned());,我也会收到语法错误。
  2. 我必须把它放在一个vec.有没有办法从静态数组扩展?

Extend特征允许您传入实现IntoIterator的任何类型(包括任何迭代器(。

单个值最简单的迭代器是std::iter::once(value),它将只生成该值一次。它还将移动值(就像Vec::into_iter一样(,因此您不需要将类型CopyClone。因此,使用单个值进行扩展的最简单方法是:

#[derive(Clone)]
struct Q{}
fn extending_function<A: Extend<Q>>(out: &mut A) {
let p = Q{};
out.extend(std::iter::once(p));
}

最新更新