2个版本
0.0.3 | 2024年6月24日 |
---|---|
0.0.2 | 2024年6月24日 |
#399 in 过程宏
每月36次下载
10KB
derive_display
用法
要在项目中使用此过程宏,请将以下内容添加到您的 Cargo.toml
[dependencies]
derive_display = "0.0.2" # use the latest version, or a specific one if needed
然后在您想要从另一个实现派生 Display
的任何地方,在该实现之前使用 #[derive_display]
属性
use derive_display::derive_display;
#[derive_display]
impl SomeTrait for MyStruct {
fn some_trait(&self, foo: &mut Bar) {
...
}
}
这意味着您可以简单地将属性标记在希望实现上,无需做其他任何事情。就这么简单。
目前支持的实现
实现 | 描述 |
---|---|
ToTokens |
简单地使用 ToTokens 返回的内容作为显示表示 |
注意:泛型和一些常见边缘情况的支持是内置的,所以它应该就像插上并使用一样简单。如果还没有涵盖到某些内容,欢迎提交问题和PR!
示例
假设我们有一个结构体,我们需要提供 Display
实现。如果恰好我们已经有一个适合的字符串格式化实现,并且这足够了,您只需简单地使用 #[derive_display]
属性标记该实现
use derive_display::derive_display;
use quote::ToTokens;
struct MyStruct {
x: i32,
y: i32,
}
#[derive_display]
impl ToTokens for MyStruct {
fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
let content = format!("MyStruct: x = {}, y = {}", self.x, self.y);
content.to_tokens(tokens);
}
}
这会扩展到以下实现,除了 源实现
impl Display for MyStruct {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
let s = &self;
let q = quote!(#s); // <-- this is for the `ToTokens` derive
f.write_fmt(format_args!("{}", q.to_string()))
}
}
这样就可以得到一个没有显式冗余工作的 Display
实现。如果没有这个crate(或实现相同功能的其他方法),开发者将不得不手动编写类似上述的 Display
实现,这非常无聊且冗余,因为它只是使用转发另一个实现的方法。
问题
在Rust中,类型不会自动实现 Display
特质,这是类型可打印所必需的。如果我们只想打印出足够表示且更易于人类阅读的内容,这可能会感觉是不必要的工作,尤其是 如果我们已经有用于构建表示我们的结构的合适格式化字符串的特质的实现。
这里是有实际的用于显示的 derive proc-macro(即 #[derive(Display)]
用于结构体(struct)),但并不总是理想的,有时结构体的成员与该宏不兼容。
此crate通过允许开发者通过使用简单的属性,从现有的特质实现中简单推导出 Display
实现来解决这个问题。
这可以以最小的努力创建一个 Display
实现并移除对详细且手动 Display
实现的需求,尤其是在它类似于已实现的 ToTokens
特质时。
支持
无论您是否使用此项目,是否从中学到了一些东西,或者只是喜欢它,请考虑通过给我买一杯咖啡来支持它,这样我可以花更多的时间在像这样的开源项目上:)
许可证
您可以在这里查看完整的许可证
此项目是根据 MIT 许可证的条款进行许可的。
依赖关系
~285–740KB
~17K SLoC