2个不稳定版本

0.3.0 2023年12月12日
0.0.1 2023年10月5日

#456过程宏


用于 2 个库(通过 constructivism_macro

MIT/Apache

83KB
2K SLoC

关于

constructivist 是将 constructivism 带入您库的方法。

问题

在某个时刻,您会发现 construtivism 真是棒极了。并且您想在您的库中使用它。让我们称这个库为 polako,仅作为一个例子。而且,您的库可能即将与其他库(或框架、或引擎)一起工作,比如它可能即将与 bevy(当然是一个例子)一起工作。在这种情况下,您将遇到一个不可抗拒的问题:您不能为外国类型实现外国特性。您不能在您的thouthend-times-amazing polako 库中为 constructivism::Construct 实现 bevy::Sprite

这就是您成为 constructivist 的方法。

constructivist 允许您将 constructivism 内联到您的库中。但是。您需要完成一些步骤。

解决方案

我假设您正在使用工作空间,并且您的库位于 crates 文件夹中。还有一个命名约定,只有一个约束:如果您的主库名为 awesomecrate,那么您的 constructivism 库必须命名为 awesomecrate_constructivism。您可以通过以下链接查看真实的 polako 如何内联 constructivism: https://github.com/jkb0o/polako/tree/eml

步骤 1:创建您的宏库

  1. 您必须创建(或使用现有的)自己的宏库以实现您的 constructivism_macro 版本。以下是创建您的 polako_macro 库的方法
# in your favorite terminal:
cd crates
mkdir polako_macro
cd polako_macro
cargo init --lib
cargo add syn proc_macro2 quote constructivist
  1. 如果是新的宏crate,您需要编辑该crate的 Cargo.toml,并使其成为 proc_macro crate
# crates/polako_macro/Cargo.toml
[lib]
proc-macro = true
  1. 您必须将 constructivism_macro 隐式地内联到您的crate中
// crates/polako_macro/src/lib.rs
implement_constructivism_macro!("polako");
  1. 您可以在您的crate中使用 constructivism_macro 的全部功能。

步骤2:创建您的constructivism crate

  1. 您需要在您的crate中内联所有 constructivism 的特性和实现
# we are in constructivism_macro dir for now, go back to crates
cd ../
mkdir polako_constructivism
cargo init --lib
cargo add --path ../polako_macro

# you most probably want to have your third-parti crate as dependency
cargo add bevy
  1. 在此阶段,您可以在您的crate中使用constructivism推导和proc宏。这意味着您现在可以实施constructivism了
// crates/polako_constructivism/src/lib.rs
pub use polako_macro::*;
// 32 is the maximum params limit, see (TODO: link the explanation)
implement_constructivism!(32);

步骤3:添加所有需要的绑定

  1. 从现在起,您正在使用定义和实现constructivism结构体和特质的crate。这是我们例子中的 bevy。将桥接模块添加到您的crate中
// crates/polako_constructivism/src/lib.rs
pub use polako_macro::*;
implement_constructivism!(32);

// add bridge mod:
mod bridge
  1. 为第三方crate提供实现
// crates/polako_constructivism/src/bridge.rs
use bevy::prelude::*;
use polaco_macro::*;

derive_construct! {
    NodeBundle -> Nothing () {
        NodeBundle::default()
    }
}

步骤4:将constructivism模块添加到您的crate根目录

  1. 正如您所猜想的,本教程的根crate名称为 polako。因此,您必须将 constructivism 模块添加到根crate,以使其在所有地方都能正常工作
// src/lib.rs
pub mod constructivism {
    // this is required:
    pub use polako_constructivism::*;
    pub use polako_macro::*;

    // this is optional (but nice):
    pub mod prelude {
        pub use polako_constructivism::prelude::*;
        pub use polako_macro::*;
    }
}

步骤5:提供反馈

  1. 您所做的所有内容在大多数情况下都无法编译(因为我只测试了一个案例)。
  2. 前往github并写一个 问题 关于没有constructivism的生活多么艰难,并对这个该死的教程哭泣,因为这个教程根本按预期工作。
  3. (可选) 找到问题的根源并提供一个 漂亮的 PR。

步骤6:克服痛苦

  1. 您已经遵循了这个教程并多次实现了constructivism。
  2. 您想知道 - 为什么没有工具可以自动化所有这些步骤?
  3. 您意识到 - 是因为没有人为这些工具编写。
  4. 您实现了 cargo-bootstrap-constructivism (向我询问如何做),提供令人惊讶的PR,并使这个crate变得更好。

许可证(无聊的)

constructivist 在以下两者之间双许可

这意味着您可以选择您喜欢的许可证!这种双许可方法在Rust生态系统中是事实标准,并且包括两者有非常好的原因。

依赖项

~0.6–1.1MB
~26K SLoC