有没有一种方法可以编写泛型函数,从而通过rust的数组扩展实体?

时间:2019-12-31 00:36:24

标签: 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中。有没有办法从静态数组扩展?

1 个答案:

答案 0 :(得分:1)

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));
}