Generics 所需的类型参数,已找到&;预期的

Generics 所需的类型参数,已找到&;预期的,generics,rust,Generics,Rust,我写了一个函数来映射向量。方法定义需要3个通用参数,并在输入向量和函数上定义: pub fn map<F, A, B>(mapFn: F, vect: &[A]) -> &[B] where F: Fn(A) -> B, { let mut list = vec![]; for v in vect { let mut value = mapFn(v); list.push(value); }

我写了一个函数来映射向量。方法定义需要3个通用参数,并在输入向量和函数上定义:

pub fn map<F, A, B>(mapFn: F, vect: &[A]) -> &[B]
where
    F: Fn(A) -> B,
{
    let mut list = vec![];

    for v in vect {
        let mut value = mapFn(v);
        list.push(value);
    }

    &list[..]
}
pub-fn-map(mapFn:F,vect:&[A])->&[B]
哪里
F:Fn(A)->B,
{
让mut list=vec![];
矢量中的v{
设mut值=mapFn(v);
列表。推送(值);
}
&清单[……]
}
我得到这个错误:

错误[E0308]:类型不匹配
-->src/main.rs:8:31
|
8 |设mut值=mapFn(v);// 首先,有一个问题

这里的问题是mapFn需要一个拥有的值,但是迭代一个切片(&[a])会得到ref

您可以将Vec作为参数或使fnMap接受&a来解决您的问题

最后,返回ref不是您想要的,您可以返回普通的Vec。

首先,有一个

这里的问题是mapFn需要一个拥有的值,但是迭代一个切片(&[a])会得到ref

您可以将Vec作为参数或使fnMap接受&a来解决您的问题


最后,返回ref不是您想要的,您可以只返回普通的Vec。

您的代码有一些问题。Rust的所有权模式很严格但公平


主要原因(不是直接导致错误)是:

let mut list = vec![]; // allocate in a function
// [cut] 
&list[..] // return a reference to memory allocated in the function
          // ... which gets freed at the end of the function
          // (if this compiled you'd have a dangling reference)
修复直接返回
Vec


第二个(这一个直接解决了您的错误):您试图从片(
vect
)中取出元素,将它们放入新向量(
list
)并返回新向量。像
vect
这样的切片并不拥有它的元素,所以它只能提供引用,但是
list
Vec
,所以它想要拥有它的元素

修复要拥有原始元素的自有版本,您必须:

  • vect
    包含您可以
    克隆的项目(以便您可以在新向量中存储它们的副本)。这限制了函数的泛型(并非所有类型都可以克隆)。通过添加绑定到函数签名的
    a:Clone
    并调用
    mapFn(v.Clone())
  • 首先赋予函数数据的完全所有权,即使输入参数a
    vect:Vec



    请注意,Rust标准库定义了更灵活的方法。在迭代输入时,它会在适当的位置逐个元素地应用函数,因此不需要拥有或克隆元素。

    您的代码存在一些问题。Rust的所有权模式很严格但公平


    主要原因(不是直接导致错误)是:

    let mut list = vec![]; // allocate in a function
    // [cut] 
    &list[..] // return a reference to memory allocated in the function
              // ... which gets freed at the end of the function
              // (if this compiled you'd have a dangling reference)
    
    修复直接返回
    Vec


    第二个(这一个直接解决了您的错误):您试图从片(
    vect
    )中取出元素,将它们放入新向量(
    list
    )并返回新向量。像
    vect
    这样的切片并不拥有它的元素,所以它只能提供引用,但是
    list
    Vec
    ,所以它想要拥有它的元素

    修复要拥有原始元素的自有版本,您必须:

  • vect
    包含您可以
    克隆的项目(以便您可以在新向量中存储它们的副本)。这限制了函数的泛型(并非所有类型都可以克隆)。通过添加绑定到函数签名的
    a:Clone
    并调用
    mapFn(v.Clone())
  • 首先赋予函数数据的完全所有权,即使输入参数a
    vect:Vec



    请注意,Rust标准库定义了更灵活的方法。它在迭代输入时将函数一个元素一个元素地应用到位,因此不需要拥有或克隆元素。

    我看不出您对函数感兴趣。此方法已存在。我看不出您的函数是否感兴趣。此方法已存在。