#display #traits #derive #impl #helper

derive_display

这是一个方便的属性,可以从另一个特质的实现中派生出 Display 实现。目前支持 ToTokens

2个版本

0.0.3 2024年6月24日
0.0.2 2024年6月24日

#399 in 过程宏

每月36次下载

MIT 许可证

10KB

derive_display

GitHub Stars Crates.io Total Downloads GitHub Issues Current Version

这是一个方便的属性,可以从另一个特质的实现中派生出 Display 实现。目前支持 ToTokens

用法

要在项目中使用此过程宏,请将以下内容添加到您的 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 特质时。

支持

无论您是否使用此项目,是否从中学到了一些东西,或者只是喜欢它,请考虑通过给我买一杯咖啡来支持它,这样我可以花更多的时间在像这样的开源项目上:)

Buy Me A Coffee

许可证

您可以在这里查看完整的许可证

此项目是根据 MIT 许可证的条款进行许可的。

依赖关系

~285–740KB
~17K SLoC