gpt4 book ai didi

rust - Serde:使用容器#[serde(default)],但带有一些必填字段

转载 作者:行者123 更新时间:2023-12-03 11:38:11 26 4
gpt4 key购买 nike

我有一个使用the #[serde(default)] container attribute的结构。
但是,应该有一个字段是必需的(如果输入数据中不存在该字段,则反序列化器应该出错,而不是退回到默认值)。

#[serde(default)]
#[derive(Serialize, Deserialize)]
struct Example {
important: i32, // <-- I want this field to be required.
a: i32, // <-- If this field isn't in the incoming data, fallback to the default value.
b: i32, // <-- If this field isn't in the incoming data, fallback to the default value.
c: i32, // <-- If this field isn't in the incoming data, fallback to the default value.
}
编辑:
以下信息不正确。 #[serde(default)]字段属性不采用结构类型的默认值,而是采用每个字段的类型的默认值。 (即,不使用 impl Default for Example。使用 impl Default for i32)。
结束编辑。
我可以这样使用 the #[serde(default)] field attribute:
#[derive(Serialize, Deserialize)]
struct Example {
important: i32,
#[serde(default)]
a: i32,
#[serde(default)]
b: i32,
#[serde(default)]
c: i32,
}
因此, important是必需的,而 abc将具有默认值。
但是复制粘贴 #[serde(default)]而不是除一个字段外的所有代码似乎都不是一个好的解决方案(我的结构具有约10个字段)。
有没有更好的办法?

最佳答案

响应您的编辑,您可以使用#[serde(default = "path")]设置每个字段的默认值。路径是返回该字段默认值的函数。
引用:https://serde.rs/field-attrs.html
例子:

const A_DEFAULT: i32 = 1;
const B_DEFAULT: i32 = 2;
const C_DEFAULT: i32 = 3;

#[derive(Serialize, Deserialize)]
struct Example {
important: i32,
#[serde(default = "a_default")]
a: i32,
#[serde(default = "b_default")]
b: i32,
#[serde(default = "c_default")]
c: i32,
}

fn a_default() -> i32{
A_DEFAULT
}
fn b_default() -> i32{
B_DEFAULT
}
fn c_default() -> i32{
C_DEFAULT
}

关于rust - Serde:使用容器#[serde(default)],但带有一些必填字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65844153/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com