[英]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.