3 个稳定版本
1.2.0 | 2023年2月24日 |
---|---|
1.1.0 | 2023年1月3日 |
1.0.0 | 2022年8月12日 |
在 Rust 模式 中排名 #2102
每月下载 24 次
7KB
Inline Default
一个用于在结构体定义中实现 Default
的宏。当在结构体定义中指定默认值比将它们分开更简洁时很有用,例如具有大量字段的结构体,或者当需要构建许多结构体时。例如,
use inline_default::inline_default;
inline_default! {
struct KeyMap {
left: char = 'h',
down: char = 'j',
up: char = 'k',
right: char = 'l',
// uses bool::default(),
flag: bool,
// any constant-time expression is allowed
qwerty: bool = Keyboard::IS_QWERTY,
}}
展开为
struct KeyMap {
left: char,
down: char,
up: char,
right: char,
flag: bool,
qwerty: bool,
}
impl Default for KeyMap {
fn default() {
KeyMap {
left: 'h',
down: 'j',
up: 'k',
right: 'l',
flag: bool::default(),
qwerty: Keyboard::IS_QWERTY,
}
}
}
支持
- 可见性指定符
- 如果没有指定则使用 Default
- 结构和字段的属性(包括派生)
- 结构和字段的文档注释
- 每个宏中的多个结构体定义
- 生命周期和泛型,但有主要限制
由于解析特质界限的复杂性,只接受没有泛型的单个特质界限。不支持 where
子句。接受指定生命周期,但不接受 'outlives' 语法 'a: 'b
。例如,以下是被接受的,
use inline_default::inline_default;
inline_default! {
/// Example struct
#[derive(Copy, Clone)]
pub(crate) struct Example<'a, T: Default> {
pub a: &'a str = "example",
/// field b
b: T,
}}
但是以下不被接受
use inline_default::inline_default;
// NOT VALID - too many trait bounds on T
inline_default! {
struct Example1<T: Default + Copy> {
a: T,
}}
// NOT VALID - Traits bounds cannot be generic
inline_default! {
struct Example2<T: From<f32>> {
a: T = T::from(0.0),
}}
// NOT VALID - outlives syntax is not supported
inline_default! {
struct Example2<'a, 'b: 'a> {
a: &'a str = "test",
b: &'b str = "test2",
}}
过程宏?
制作一个过程宏将具有更全面的功能,但我没有这个兴趣。