繁体   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