如何使用phf::Map创建值为自定义结构体的静态映射?
实现方案
首先要满足phf宏的核心要求:映射的所有键值必须是编译期可计算的常量,对应你的需求需要按如下步骤调整:
- 给自定义结构体实现
const构造方法
你需要把WebsiteInfo的new方法标记为const,确保它可以在编译期执行,同时结构体所有字段都使用'static生命周期的类型:
#[derive(Debug)] pub struct WebsiteInfo { name: &'static str, country: &'static str, state: &'static str, city: &'static str, } impl WebsiteInfo { // 必须标记为const,支持编译期调用 pub const fn new(name: &'static str, country: &'static str, state: &'static str, city: &'static str) -> Self { Self { name, country, state, city } } }
- 两种初始化映射的方式
方式1(更推荐):直接存储结构体实例
如果你的结构体体积不大(这里全是字符串引用,开销极低),直接把结构体作为值存在映射里即可,不需要额外加引用:
use phf::{phf_map, Map}; static MARKETPLACE_MAP: phf::Map<&'static str, WebsiteInfo> = phf_map! { "Amazon.com" => WebsiteInfo::new("Amazon", "USA", "WA", "Seattle"), "Google.com" => WebsiteInfo::new("Google", "USA", "CA", "Mountain View"), };
方式2:存储&'static引用
如果你确实需要存静态引用,需要先把每个结构体实例定义为静态常量,再把引用放入映射:
// 先定义静态的结构体实例 static AMAZON_INFO: WebsiteInfo = WebsiteInfo::new("Amazon", "USA", "WA", "Seattle"); static GOOGLE_INFO: WebsiteInfo = WebsiteInfo::new("Google", "USA", "CA", "Mountain View"); static MARKETPLACE_MAP: phf::Map<&'static str, &'static WebsiteInfo> = phf_map! { "Amazon.com" => &AMAZON_INFO, "Google.com" => &GOOGLE_INFO, };
内容的提问来源于stack exchange,提问作者tom
相关产品推荐
相关产品推荐

