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

如何在quote宏中插入类型名为字符串字面量并正确转义引号?

解决quote宏中生成字符串字面量的引号问题

你遇到的问题核心不是引号转义,而是如何正确将结构体名称转换为字符串字面量。以下是具体的解决方法:

步骤1:提取结构体的标识符

首先需要从syn::Type中提取出结构体的名称标识符(syn::Ident),因为你拿到的self_ty是包裹后的类型,需要解析出具体的结构体名:

let struct_ident = match &*self_ty {
    syn::Type::Path(type_path) => type_path
        .path
        .segments
        .last()
        .expect("仅支持具名结构体类型")
        .ident
        .clone(),
    _ => panic!("该宏仅支持具名结构体类型"),
};

步骤2:用stringify!生成字符串字面量

在quote宏中使用stringify!宏,它会将传入的标识符直接转换为对应的字符串字面量,完全不需要手动处理引号:

quote!(
    impl StructName for #self_ty {
        fn name(&self) -> &'static str {
            stringify!(#struct_ident)
        }
    }
)

这样生成的代码会自动包含正确的双引号,比如针对结构体User,生成的代码是:

impl StructName for User {
    fn name(&self) -> &'static str {
        stringify!(User)
    }
}

而stringify!(User)在编译时会被替换为"User",完全符合需求。

额外说明:quote宏中的引号使用

如果只是需要在quote中生成固定的字符串字面量,直接写双引号即可,不需要转义。比如:

quote!(
    fn default_name() -> &'static str {
        "UnknownStruct"
    }
)

quote宏会正确保留双引号,生成符合语法的Rust代码。

内容的提问来源于stack exchange,提问作者LunarEclipse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:15:04