簡體   English   中英

無法推斷結構中泛型類型參數的類型

[英]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>指定了AB的類型。 一般來說,我對 rust 和 generics 的編程還很陌生,所以可能是我遺漏了一些非常明顯的東西,但我無法弄清楚這個問題的解決方案是什么。 我已經嘗試更改 function 簽名和實現以返回Self而不是BidiMap<u8, B> ,但隨后它抱怨在調用map.insert()時無法將數組索引轉換為通用類型A

這是重現您的問題的最小示例

如您所述,確實正確推斷了from_array_with_u8_indices返回類型。

但是,無法推斷BidiMap::from_array_with_u8_indices具體類型,因為該方法是為BidiMap<A, B>實現的。 返回類型與此類型無關。

兩個可能的修復:

使用 turbofish 語法明確指定具體類型:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM