Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 无法推断结构中泛型类型参数的类型_Generics_Rust - Fatal编程技术网

Generics 无法推断结构中泛型类型参数的类型

Generics 无法推断结构中泛型类型参数的类型,generics,rust,Generics,Rust,我目前正试图在rust中实现base64编码/解码,这是一个更大项目的一部分,需要一个数据结构来将base64字符集映射到ASCII,反之亦然。我在中找到了一个双向HashMap的基本实现,但由于我需要base64映射作为全局变量,以便两个编码/解码函数都能访问它,所以我不能一个接一个地添加字符映射。因此,我在BidiMap实现中添加了另一个函数,该函数在一批中完成(其他函数实现与上面的链接中相同): impl BidiMap 哪里 A:Eq+Hash, B:Eq+Hash, { // ...

我目前正试图在rust中实现base64编码/解码,这是一个更大项目的一部分,需要一个数据结构来将base64字符集映射到ASCII,反之亦然。我在中找到了一个双向
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);