gpt4 book ai didi

generics - 无法推断struct中通用类型参数的类型

转载 作者:行者123 更新时间:2023-12-03 11:44:39 24 4
gpt4 key购买 nike

我目前正试图在rust中实现rust中的base64编码/解码,这是一个较大项目的一部分,并且需要一种数据结构,用于将base64字符集映射为ASCII,反之亦然。我在this StackOverflow answer中找到了双向HashMap的准系统实现,但是由于我需要base64映射是一个全局变量,以便两个编码/解码功能都可以访问它,所以我不能只是一个一个地添加字符映射。因此,我在BidiMap实现中添加了另一个函数,该函数可以批量执行(其他函数实现与上面的链接相同):

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中调用此函数:
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`

即使我使用 A指定了 BBidiMap<u8, u8>的类型。我对使用 rust 和一般泛型进行编程非常陌生,因此可能是我确实遗漏了一些明显的东西,但是我不知道该问题的解决方案是什么。我已经尝试过更改函数签名和实现以返回 Self而不是 BidiMap<u8, B>,但是随后它提示无法在调用 A时将数组索引转换为通用类型 map.insert()

最佳答案

这是一个minimal example来重现您的问题。
如您所述,确实可以正确推断出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);
Example of working code in the playground

关于generics - 无法推断struct中通用类型参数的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64253271/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com