gpt4 book ai didi

rust - serde - 多个默认值组合在一起?

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

我正在尝试使用 Serde 加载一个 Toml 文件,它包含多个 bool 值,如果在文本文件中找不到,我想将它们全部默认为 false。

我目前的实现是:

#[derive(serde::Deserialize, serde::Serialize)]
#[serde(rename_all="PascalCase")]
pub struct SomeConfigStruct {
// This one *must* exist, non optional, non defaulted.
class_name : String,

#[serde(default = "default_boolean")]
parent_in_constructor : bool,

#[serde(default = "default_boolean")]
set_user_texts : bool,

#[serde(default = "default_boolean")]
singleton : bool,

#[serde(default = "default_boolean")]
use_enum_types : bool,
}

我该如何做:
#[derive(serde::Deserialize, serde::Serialize)]
#[serde(rename_all="PascalCase")]
pub struct SomeConfigStruct {
class_name : String,

#[serde(type = bool, default = "default_boolean")]
parent_in_constructor : bool,
set_user_texts : bool,
singleton : bool,
use_enum_types : bool,
}

[编辑,结构上的新成员,以更好地举例说明我的需要。]

最佳答案

更新了新的约束

我不知道这样的宏,据我所知不存在。不过,我可以提供替代解决方案。

#[derive(serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "PascalCase")]
pub struct SomeConfigStruct {
class_name: String,

#[serde(default)]
#[serde(flatten)]
defaulting_values: SomeConfigStructDefaulting,
}

#[derive(serde::Deserialize, serde::Serialize)]
#[serde(default)]
pub struct SomeConfigStructDefaulting {
parent_in_constructor: bool,
set_user_texts: bool,
singleton: bool,
use_enum_types: bool,
}

// This will be called to fill in missing spots in defaulting_values.
// Will also be called, if defaulting_values is missing altogether.
impl Default for SomeConfigStructDefaulting {
fn default() -> Self {
let default_boolean = true;
Self {
parent_in_constructor: default_boolean,
set_user_texts: default_boolean,
singleton: default_boolean,
use_enum_types: default_boolean,
}
}
}

这肯定不会减少行数,但它确实修复了 default_boolean到一个值,如果这是您的主要关注点。

这样,您的序列化表示仍然看起来相同,并且您可以轻松编写包装器而不必编写 some_config_struct.defaulting_values在您的实际代码中。

关于rust - serde - 多个默认值组合在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60674551/

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