#macro-derive #derive #display #add #traits-structs #from #into-iterator

无需std derive_more_preview

为更多特性添加 #[derive(x)] 宏

1 个不稳定版本

0.1.0 2023年7月10日

#251 in 过程宏

MIT 许可证

62KB
989

derive_more_preview

derive_more 的分支,直到发布新版本。跟踪问题 https://github.com/JelteF/derive_more/issues/259

Build Status Latest Version Rust Documentation GitHub license Rust 1.65+ Unsafe Forbidden

Rust有很多内置特性为它的基本类型实现,例如 AddNotFromDisplay。然而,当将这些类型封装在你的自定义结构体或枚举中时,你会失去这些特性的实现,并需要重新创建它们。当你的自定义结构体非常简单时,这尤其令人烦恼,例如在使用通常建议的新类型模式(例如 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)]

转换特性

这些特性用于在类型之间自动转换。

  1. FromStr
  2. TryInto
  3. IntoIterator
  4. AsRef
  5. AsMut

格式化特性

这些特性用于以不同方式将结构体转换为字符串。

  1. Debug
  2. Display-like,包含 DisplayBinaryOctalLowerHexUpperHexLowerExpUpperExpPointer

错误处理特性

这些特性用于定义错误类型。

  1. Error

运算符

这些特性可用于运算符重载。

  1. Index
  2. Deref
  3. Not-like,包含 NotNeg
  4. Add-like,包含 AddSubBitAndBitOrBitXor
  5. Mul-like,包含 MulDivRemShrShl
  6. Sum-like,包含 SumProduct
  7. IndexMut
  8. DerefMut
  9. AddAssign-like,包含 AddAssignSubAssignBitAndAssignBitOrAssignBitXorAssign
  10. MulAssign-like,包含 MulAssignDivAssignRemAssignShrAssignShlAssign

静态方法

这些不会推导特性,而是推导静态方法。

  1. Constructor,这会推导出一个可以用来作为构造函数的 new 方法。如果您需要更多自定义的构造函数,请查看 derive-new 包。
  2. IsVariant,对于枚举类型中的每个变体 foo,推导出一个 is_foo 方法。
  3. Unwrap,对于枚举类型中的每个变体 foo,推导出一个 unwrap_foo 方法。
  4. 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