Rust 函数调用上的类型暗示

Rust 函数调用上的类型暗示,rust,Rust,我试图从结构中提取函数。原件(工作)为: 其中,self.foos是一个HashMap 拔牙后我有 fn f<'a>(foos: HashMap<Id, Vec<Foo>, BuildHasherDefault<FnvHasher>>, id: Id) -> &'a [Foo] { &foos.get(&id).map_or(&[], |xs| &**xs); } 我想我需要提供一个类型提示。

我试图从结构中提取函数。原件(工作)为:

其中,
self.foos
是一个
HashMap

拔牙后我有

fn f<'a>(foos: HashMap<Id, Vec<Foo>, BuildHasherDefault<FnvHasher>>, id: Id) -> &'a [Foo] {
    &foos.get(&id).map_or(&[], |xs| &**xs);
}

我想我需要提供一个类型提示。是这样吗?如果是这样,我如何在调用
Option.map\U或(self,default:U,f:f)->U
时显式声明
U
的类型您得到的错误隐藏了代码的真正问题。在这种情况下,通过更加明确,编译器可以更进一步,并给出与解决问题更相关的其他错误

首先,让我们通过将
&[]
更改为
&[][…]
来显式地将数组转换为切片,从而消除类型不匹配

fn f<'a>(foos: HashMap<Id, Vec<Foo>, BuildHasherDefault<FnvHasher>>, id: Id) -> &'a [Foo] {
    &foos.get(&id).map_or(&[][..], |xs| &**xs);
}

您得到的错误隐藏了代码的真正问题。在这种情况下,通过更加明确,编译器可以更进一步,并给出与解决问题更相关的其他错误

首先,让我们通过将
&[]
更改为
&[][…]
来显式地将数组转换为切片,从而消除类型不匹配

fn f<'a>(foos: HashMap<Id, Vec<Foo>, BuildHasherDefault<FnvHasher>>, id: Id) -> &'a [Foo] {
    &foos.get(&id).map_or(&[][..], |xs| &**xs);
}
fn f<'a>(foos: HashMap<Id, Vec<Foo>, BuildHasherDefault<FnvHasher>>, id: Id) -> &'a [Foo] {
    &foos.get(&id).map_or(&[][..], |xs| &**xs);
}
error: not all control paths return a value [--explain E0269]
  --> <anon>:16:1
   |>
16 |> fn f<'a>(foos: HashMap<Id, Vec<Foo>, BuildHasherDefault<FnvHasher>>, id: Id) -> &'a [Foo] {
   |> ^
fn f<'a>(foos: HashMap<Id, Vec<Foo>, BuildHasherDefault<FnvHasher>>, id: Id) -> &'a [Foo] {
    &foos.get(&id).map_or(&[][..], |xs| &**xs)
}
error: `foos` does not live long enough
  --> <anon>:17:6
   |>
17 |>     &foos.get(&id).map_or(&[][..], |xs| &**xs)
   |>      ^^^^
note: reference must be valid for the lifetime 'a as defined on the block at 16:90...
  --> <anon>:16:91
   |>
16 |> fn f<'a>(foos: HashMap<Id, Vec<Foo>, BuildHasherDefault<FnvHasher>>, id: Id) -> &'a [Foo] {
   |>                                                                                           ^
note: ...but borrowed value is only valid for the scope of function body at 16:90
  --> <anon>:16:91
   |>
16 |> fn f<'a>(foos: HashMap<Id, Vec<Foo>, BuildHasherDefault<FnvHasher>>, id: Id) -> &'a [Foo] {
   |>                                                                                           ^
fn f(foos: &HashMap<Id, Vec<Foo>, BuildHasherDefault<FnvHasher>>, id: Id) -> &[Foo] {
    foos.get(&id).map_or(&[], |xs| &**xs)
}