gpt4 book ai didi

rust - impl 没有派生的大型结构的默认糖

转载 作者:行者123 更新时间:2023-12-05 08:45:40 28 4
gpt4 key购买 nike

如果我有一个需要Default实现的结构,如果所有字段的类型都有Default实现的themsevles,那么我可以使用derive 宏,否则我需要手动实现 Default。但是,在某些情况下,我有一个大型结构,其中几乎所有字段都是可派生的,除了少数字段的类型没有实现 Default ,我可以 impl 我自己,因为类型是外部的。这最终导致了以下示例中的情况。我宁愿避免这种情况,因为这意味着我需要在两个地方之间保持字段同步,这更耗时、容易出错且冗长。我希望可能有一些语法 suagr 来避免这种情况,但我是使用rust 的新手,想不出任何东西。我在想类似的东西:

impl Default for Data2 {
fn default() -> Self {
Self {
external_data: ExternalType::One,
..Default::default(),
}
}
}

例子

#[derive(Default)]
struct Data {
name: Option<String>,
flag: bool,
selected: Vec<String>,
show_reference: Option<String>,
index: Option<usize>,
create_name: String,
create_type: String,
}

enum ExternalType {
One,
Two,
}
// #[derive(Default)]
struct Data2 {
name: Option<String>,
flag: bool,
selected: Vec<String>,
show_reference: Option<String>,
index: Option<usize>,
create_name: String,
create_type: String,
external_data: ExternalType,
}
impl Default for Data2 {
fn default() -> Self {
Self {
name: Default::default(),
flag: Default::default(),
selected: Default::default(),
show_reference: Default::default(),
index: Default::default(),
create_name: Default::default(),
create_type: Default::default(),
external_data: ExternalType::One,
}
}
}

最佳答案

我认为 smart-default crate 可以处理这个。它允许您派生 SmartDefault,它为除具有 #[default(my_default_value)] 属性的所有字段派生 Default

例子:

use smart_default::SmartDefault;

#[derive(SmartDefault)]
enum Foo {
Bar,
#[default]
Baz {
#[default = 12]
a: i32,
b: i32,
#[default(Some(Default::default()))]
c: Option<i32>,
#[default(_code = "vec![1, 2, 3]")]
d: Vec<u32>,
#[default = "four"]
e: String,
},
Qux(i32),
}

还有更通用的derivative crate 允许您自定义all 派生工作的方式,而不仅仅是Default,但有点冗长(因为它更通用)。

例子:

use derivative::Derivative;

#[derive(Derivative)]
#[derivative(Default)]
pub struct RegexOptions {
pub pats: Vec<String>,
#[derivative(Default(value="10 * (1 << 20)"))]
pub size_limit: usize,
#[derivative(Default(value="2 * (1 << 20)"))]
pub dfa_size_limit: usize,
pub case_insensitive: bool,
pub multi_line: bool,
pub dot_matches_new_line: bool,
pub swap_greed: bool,
pub ignore_whitespace: bool,
#[derivative(Default(value="true"))]
pub unicode: bool,
}

关于rust - impl 没有派生的大型结构的默认糖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71966763/

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