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