1 个不稳定版本
0.1.0 | 2023年7月10日 |
---|
#251 in 过程宏
62KB
989 行
derive_more_preview
derive_more
的分支,直到发布新版本。跟踪问题 https://github.com/JelteF/derive_more/issues/259
Rust有很多内置特性为它的基本类型实现,例如 Add
、Not
、From
或 Display
。然而,当将这些类型封装在你的自定义结构体或枚举中时,你会失去这些特性的实现,并需要重新创建它们。当你的自定义结构体非常简单时,这尤其令人烦恼,例如在使用通常建议的新类型模式(例如 MyInt(i32)
)时。
这个库试图消除这些烦恼和相应的样板代码。它通过允许你为结构和枚举推导出大量常用特性来实现这一点。
示例代码
使用这个库,以下代码可以正常工作
use derive_more::{Add, Display, From, Into};
#[derive(PartialEq, From, Add)]
struct MyInt(i32);
#[derive(PartialEq, From, Into)]
struct Point2D {
x: i32,
y: i32,
}
#[derive(PartialEq, From, Add, Display)]
enum MyEnum {
#[display("int: {_0}")]
Int(i32),
Uint(u32),
#[display("nothing")]
Nothing,
}
assert!(MyInt(11) == MyInt(5) + 6.into());
assert!((5, 6) == Point2D { x: 5, y: 6 }.into());
assert!(MyEnum::Int(15) == (MyEnum::Int(8) + 7.into()).unwrap());
assert!(MyEnum::Int(15).to_string() == "int: 15");
assert!(MyEnum::Uint(42).to_string() == "42");
assert!(MyEnum::Nothing.to_string() == "nothing");
可推导的特性
以下是你可以使用此库推导的所有特性。一些特性推导非常相似,因此进一步文档将只显示其中之一。你可以通过它们名称中的“-like”后缀来识别这些特性。进一步文档中使用的将是名称之前的唯一一个。
了解使用此crate中某个衍生函数生成的代码是非常重要的。因此,以下链接解释了每个组中为每个特性生成的代码。
你可以使用 cargo-expand
工具来查看为特定类型生成的确切代码。这将显示包含所有宏和推导的代码。
注意:您仍然需要分别推导每个特性。因此,#[derive(Mul)]
并不会自动推导出 Div
。要同时推导两者,您应该使用 #[derive(Mul, Div)]
转换特性
这些特性用于在类型之间自动转换。
格式化特性
这些特性用于以不同方式将结构体转换为字符串。
Debug
Display
-like,包含Display
、Binary
、Octal
、LowerHex
、UpperHex
、LowerExp
、UpperExp
、Pointer
错误处理特性
这些特性用于定义错误类型。
运算符
这些特性可用于运算符重载。
Index
Deref
Not
-like,包含Not
和Neg
Add
-like,包含Add
、Sub
、BitAnd
、BitOr
、BitXor
Mul
-like,包含Mul
、Div
、Rem
、Shr
和Shl
Sum
-like,包含Sum
和Product
IndexMut
DerefMut
AddAssign
-like,包含AddAssign
、SubAssign
、BitAndAssign
、BitOrAssign
和BitXorAssign
MulAssign
-like,包含MulAssign
、DivAssign
、RemAssign
、ShrAssign
和ShlAssign
静态方法
这些不会推导特性,而是推导静态方法。
Constructor
,这会推导出一个可以用来作为构造函数的new
方法。如果您需要更多自定义的构造函数,请查看derive-new
包。IsVariant
,对于枚举类型中的每个变体foo
,推导出一个is_foo
方法。Unwrap
,对于枚举类型中的每个变体foo
,推导出一个unwrap_foo
方法。TryUnwrap
,对于枚举类型中的每个变体foo
,推导出一个try_unwrap_foo
方法。
安装
此库需要Rust 1.65或更高版本。为了避免冗余的编译时间,默认情况下不支持任何派生。您必须将每种派生类型作为功能在 Cargo.toml
中启用
[dependencies]
derive_more = "0.99.0"
# You can specify the types of derives that you need for less time spent
# compiling. For the full list of features see this crate its `Cargo.toml`.
features = ["from", "add", "iterator"]
# If you don't care much about compilation times and simply want to have
# support for all the possible derives, you can use the "full" feature.
features = ["full"]
# If you run in a `no_std` environment you should disable the default features,
# because the only default feature is the "std" feature.
# NOTE: You can combine this with "full" feature to get support for all the
# possible derives in a `no_std` environment.
default-features = false
并将此置于您的Rust文件顶部
// use the derives that you want in the file
use derive_more::{Add, Display, From};
如果您仍然使用Rust 2015,请添加以下内容代替
extern crate core;
#[macro_use]
extern crate derive_more;
# fn main() {} // omit wrapping statements above into `main()` in tests
依赖项
~0.3–0.9MB
~20K SLoC