You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用phf::Map创建值为自定义结构体的静态映射?

实现方案

首先要满足phf宏的核心要求:映射的所有键值必须是编译期可计算的常量,对应你的需求需要按如下步骤调整:

  1. 给自定义结构体实现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. 两种初始化映射的方式

方式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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:06:04