为枚举结构体变体添加flatten属性时出现‘cannot find value __collect’错误
解决serde derive时的
cannot find value __collect in this scope错误 这个问题我之前也碰到过,大概率是serde版本兼容问题或者旧版本serde的一个小bug导致的——具体来说是当你在#[serde(untagged)]枚举里使用#[serde(flatten)]字段时,旧版的serde_derive宏生成的代码存在逻辑漏洞。下面是一步步的解决方法:
1. 统一serde依赖并启用derive特性
首先打开你的Cargo.toml,把serde的依赖改成这样,现在serde已经把derive功能整合到主包了,不需要单独引入serde_derive:
[dependencies] serde = { version = "1.0", features = ["derive"] }
之前单独依赖serde_derive很容易出现版本不匹配的情况,这也是触发这个错误的常见原因。
2. 清理代码中的冗余声明
Rust 2018及以后的版本已经不需要extern crate声明了,把代码开头的这两行删掉:
extern crate serde; #[macro_use] extern crate serde_derive;
换成直接导入serde的核心trait:
use serde::{Serialize, Deserialize};
3. 修正后的完整代码
最终你的代码应该是这样的:
use serde::{Serialize, Deserialize}; #[derive(Debug, Default, Serialize, Deserialize)] pub struct Base { bold: Option<bool>, } #[derive(Debug, Serialize, Deserialize)] #[serde(untagged)] pub enum Component { String { #[serde(flatten)] base: Base, text: String, }, }
为什么这样能解决问题?
旧版本的serde_derive在处理untagged枚举内的flatten字段时,会生成一段引用__collect变量的代码,但这个变量并没有在对应的作用域中定义,这是一个已经被修复的bug。升级到最新的serde 1.0+版本,同时使用整合后的derive特性,就能彻底避免这个问题。
内容的提问来源于stack exchange,提问作者wingerse
相关产品推荐
相关产品推荐

