Generics 无法推断结构中泛型类型参数的类型
我目前正试图在rust中实现base64编码/解码,这是一个更大项目的一部分,需要一个数据结构来将base64字符集映射到ASCII,反之亦然。我在中找到了一个双向Generics 无法推断结构中泛型类型参数的类型,generics,rust,Generics,Rust,我目前正试图在rust中实现base64编码/解码,这是一个更大项目的一部分,需要一个数据结构来将base64字符集映射到ASCII,反之亦然。我在中找到了一个双向HashMap的基本实现,但由于我需要base64映射作为全局变量,以便两个编码/解码函数都能访问它,所以我不能一个接一个地添加字符映射。因此,我在BidiMap实现中添加了另一个函数,该函数在一批中完成(其他函数实现与上面的链接中相同): impl BidiMap 哪里 A:Eq+Hash, B:Eq+Hash, { // ...
HashMap
的基本实现,但由于我需要base64映射作为全局变量,以便两个编码/解码函数都能访问它,所以我不能一个接一个地添加字符映射。因此,我在BidiMap
实现中添加了另一个函数,该函数在一批中完成(其他函数实现与上面的链接中相同):
impl BidiMap
哪里
A:Eq+Hash,
B:Eq+Hash,
{
// ...
pub fn来自带有索引(值:&[B])的数组\u->BidiMap
其中B:复制,
{
if values.len()>u8::MAX as usize+1{
panic!(“此函数应仅使用索引适合u8的数组调用”);
}
让mut映射:BidiMap=BidiMap::new();
对于0..values.len()中的i{
图.插入(i为u8,值[i]);
}
地图
}
// ...
}
然后在另一个文件base64.rs中调用此函数:
use crate::datastructures::bidi_map::BidiMap;
const base64_values: [u8; 65] = [
0x41, 0x42, 0x43, ... , 0x3D,
];
const base64_map: BidiMap<u8, u8> = BidiMap::from_array_with_u8_indices(&base64_values);
使用板条箱::数据结构::bidi_映射::BidiMap;
常量base64_值:[u8;65]=[
0x41、0x42、0x43、…、0x3D、,
];
常量base64\u映射:BidiMap=BidiMap::来自带有索引的数组(和base64\u值);
但是当我试图编译这段代码时,我得到了错误
错误[E0282]:需要类型注释
-->src/encodings/base64.rs:10:37
|
10 | const base64_map:BidiMap=BidiMap::from_数组_,带有_u8_索引(&base64_值);
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^无法推断类型参数“A”的类型`
即使我用BidiMap
为A
和B
指定了类型。我对rust编程和泛型编程都很陌生,所以我可能遗漏了一些非常明显的东西,但我不知道这个问题的解决方案是什么。我已经尝试将函数签名和实现更改为返回Self
而不是BidiMap
,但是它抱怨调用map.insert()
时无法将数组索引转换为泛型类型a
,下面是一个重现您的问题的示例
正如您所注意到的,对于带有索引的_数组的的返回类型确实是正确的
但是,由于该方法是为BidiMap实现的,因此无法推断BidiMap::from_array_和_u8_索引
的具体类型,欢迎使用堆栈溢出!欢迎来到堆栈溢出!很难回答你的问题,因为它没有包含一个。我们无法说出代码中存在哪些板条箱(及其版本)、类型、特征、字段等。在将来,如果可能的话,尝试在上重现您的错误,否则在全新的Cargo项目中,然后编辑您的问题以包含其他信息。这里有一些技巧可以用来减少您在此处发布的原始代码。谢谢问题是,您编写impl BidiMap
,然后返回一个BidiMap
,硬编码您可能想要的a
,因此编译器不知道类型参数a
应该是什么。如果您将的返回类型从带有索引的数组更改为BidiMap
,或者将实现更改为impl BidiMap
,那么它应该可以正常编译
use crate::datastructures::bidi_map::BidiMap;
const base64_values: [u8; 65] = [
0x41, 0x42, 0x43, ... , 0x3D,
];
const base64_map: BidiMap<u8, u8> = BidiMap::from_array_with_u8_indices(&base64_values);
let map = BidiMap::<u8, u8>::from_array_with_u8_indices(&base64_values);
impl<B> BidiMap<u8, B>
where
B: Eq + Hash,
{
pub fn from_array_with_u8_indices(values: &[B]) -> Self
where
B: Copy,
{
let mut map: BidiMap<u8, B> = BidiMap::new();
//...
map
}
}
let base64_map = BidiMap::from_array_with_u8_indices(&base64_values);