[英]Cannot infer type for generic type parameter in struct
我目前正在尝试在 rust 中实现 base64 编码/解码作为更大项目的一部分,并且需要一个数据结构来将 base64 字符集映射到 ASCII,反之亦然。 我在这个 StackOverflow 答案中找到了双向HashMap
的准系统实现,但是由于我需要 base64 map 成为全局变量以便两个编码/解码函数都可以访问它,所以我不能只是一个一个地添加字符映射. 所以我在BidiMap
实现中添加了另一个 function,它在一批中完成(其他 function 实现与上面的链接相同):
impl<A, B> BidiMap<A, B>
where
A: Eq + Hash,
B: Eq + Hash,
{
// ...
pub fn from_array_with_u8_indices(values: &[B]) -> BidiMap<u8, B>
where B: Copy,
{
if values.len() > u8::MAX as usize + 1 {
panic!("This function should only be called with an array whose indices fit into an u8.");
}
let mut map: BidiMap<u8, B> = BidiMap::new();
for i in 0..values.len() {
map.insert(i as u8, values[i]);
}
map
}
// ...
}
然后我在另一个文件 base64.rs 中调用这个 function:
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);
但是当我尝试编译这段代码时,我得到了错误
error[E0282]: type annotations needed
--> src/encodings/base64.rs:10:37
|
10 | const base64_map: BidiMap<u8, u8> = BidiMap::from_array_with_u8_indices(&base64_values);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type for type parameter `A`
即使我使用BidiMap<u8, u8>
指定了A
和B
的类型。 一般来说,我对 rust 和 generics 的编程还很陌生,所以可能是我遗漏了一些非常明显的东西,但我无法弄清楚这个问题的解决方案是什么。 我已经尝试更改 function 签名和实现以返回Self
而不是BidiMap<u8, B>
,但随后它抱怨在调用map.insert()
时无法将数组索引转换为通用类型A
这是重现您的问题的最小示例。
如您所述,确实正确推断了from_array_with_u8_indices
的返回类型。
但是,无法推断BidiMap::from_array_with_u8_indices
的具体类型,因为该方法是为BidiMap<A, B>
实现的。 返回类型与此类型无关。
两个可能的修复:
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.