Rust创建const HashMap报错:意外字符与预期结构体字段如何解决
错误原因
1. 语法使用错误
你混淆了Rust函数调用、结构体字面量和其他语言对象初始化的语法:
HashMap::from是函数调用,需要用**小括号()**包裹参数,你误用了结构体字面量的大括号{},编译器会将大括号内的内容识别为结构体字段定义,自然会报错「期望结构体字段,却得到(」。- Rust的
HashMap::from接收的是键值对元组组成的数组,不是键: 值的写法,冒号分隔键值的写法在Rust里仅用于结构体字段初始化,不属于HashMap的初始化语法,这也是触发字符串意外报错的直接原因。
2. const常量声明不合法
标准库的HashMap底层依赖堆内存分配,它的初始化方法没有标记为const,不能在const常量的上下文中直接初始化,你声明const ANSWER_KEY本身就不符合Rust的语法约束。
3. 括号匹配错误
代码中D选项的末尾多写了一个右括号),也会额外触发语法解析错误。
修复方案
场景1:局部运行时使用
如果不需要全局复用这个答案表,直接在函数内用let声明即可,正确写法如下:
use std::collections::HashMap; fn main() { let answer_key: HashMap<(u8, &str), (&str, [&str;4])> = HashMap::from([ ( (1, "What is a programming language?"), ("B", [ "A. A language that improves programming.", "B. A human readable language for humans that translates to a binary language to communicate with computers.", "C. A language read by computers that translates to a unary language to communicate with humans.", "D. A language created by Alan Turing." ]) ) ]); }
场景2:全局静态复用
如果需要作为全局常量使用,可以用once_cell库的Lazy实现运行时一次初始化,写法如下:
首先在Cargo.toml添加依赖:
once_cell = "1.18.0"
代码实现:
use std::collections::HashMap; use once_cell::sync::Lazy; static ANSWER_KEY: Lazy<HashMap<(u8, &str), (&str, [&str;4])>> = Lazy::new(|| { HashMap::from([ ( (1, "What is a programming language?"), ("B", [ "A. A language that improves programming.", "B. A human readable language for humans that translates to a binary language to communicate with computers.", "C. A language read by computers that translates to a unary language to communicate with humans.", "D. A language created by Alan Turing." ]) ) ]) });
后续可以直接在任意位置用ANSWER_KEY.get(...)访问存储的内容。
内容的提问来源于stack exchange,提问作者Sergio Bost
相关产品推荐
相关产品推荐

