rust 发生移动是因为value的类型为'T',而该类型不实现'Copy'特性

rdrgkggo  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(131)

我试着做一个函数,返回向量中第k个元素的函数应用程序。下面是我的代码:

fn action<T, F: Fn(T) -> T>(f: F, k: usize, v: Vec<T>) -> Option<T> {
    if k >= v.len() {
        return None;
    }
    Some(f(v[k]))
}

我收到了以下错误消息:

error[E0507]: cannot move out of index of `Vec<T>`
 --> src/lib.rs:5:12
  |
5 |     Some(f(v[k]))
  |            ^^^^ move occurs because value has type `T`, which does not implement the `Copy` trait

For more information about this error, try `rustc --explain E0507`.

如何解决此问题?

5ktev3wc

5ktev3wc1#

这里有一种方法:

fn action<T: Copy, F: Fn(T) -> T>(f: F, k: usize, v: Vec<T>) -> Option<T>
{
    if k >= v.len() {
        return None;
    }
    Some(f(v[k]))
}

下面是另一种方式:

fn action<T, F: Fn(&T) -> T>(f: F, k: usize, v: Vec<T>) -> Option<T>
{
    if k >= v.len() {
        return None;
    }
    Some(f(&v[k]))
}

下面是第三种方式:

fn action<T: Clone, F: Fn(T) -> T>(f: F, k: usize, v: Vec<T>) -> Option<T>
{
    if k >= v.len() {
        return None;
    }
    Some(f(v[k].clone()))
}

最好的方法取决于你的特定数据。当然,传递一个引用比把数据克隆到函数中更有效,但如果你对数字向量进行操作,这并不重要。

相关问题