2个不稳定版本
0.3.0 | 2023年12月12日 |
---|---|
0.0.1 | 2023年10月5日 |
#456 在 过程宏
用于 2 个库(通过 constructivism_macro)
83KB
2K SLoC
关于
constructivist
是将 constructivism
带入您库的方法。
问题
在某个时刻,您会发现 construtivism
真是棒极了。并且您想在您的库中使用它。让我们称这个库为 polako
,仅作为一个例子。而且,您的库可能即将与其他库(或框架、或引擎)一起工作,比如它可能即将与 bevy
(当然是一个例子)一起工作。在这种情况下,您将遇到一个不可抗拒的问题:您不能为外国类型实现外国特性。您不能在您的thouthend-times-amazing polako
库中为 constructivism::Construct
实现 bevy::Sprite
。
这就是您成为 constructivist
的方法。
constructivis
t
允许您将 constructivis
m
内联到您的库中。但是。您需要完成一些步骤。
解决方案
我假设您正在使用工作空间,并且您的库位于 crates
文件夹中。还有一个命名约定,只有一个约束:如果您的主库名为 awesomecrate
,那么您的 constructivism 库必须命名为 awesomecrate_constructivism
。您可以通过以下链接查看真实的 polako
如何内联 constructivism: https://github.com/jkb0o/polako/tree/eml
步骤 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
- 如果是新的宏crate,您需要编辑该crate的
Cargo.toml
,并使其成为proc_macro
crate
# crates/polako_macro/Cargo.toml
[lib]
proc-macro = true
- 您必须将
constructivism_macro
隐式地内联到您的crate中
// crates/polako_macro/src/lib.rs
implement_constructivism_macro!("polako");
- 您可以在您的crate中使用
constructivism_macro
的全部功能。
步骤2:创建您的constructivism crate
- 您需要在您的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
- 在此阶段,您可以在您的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:添加所有需要的绑定
- 从现在起,您正在使用定义和实现constructivism结构体和特质的crate。这是我们例子中的
bevy
。将桥接模块添加到您的crate中
// crates/polako_constructivism/src/lib.rs
pub use polako_macro::*;
implement_constructivism!(32);
// add bridge mod:
mod bridge
- 为第三方crate提供实现
// crates/polako_constructivism/src/bridge.rs
use bevy::prelude::*;
use polaco_macro::*;
derive_construct! {
NodeBundle -> Nothing () {
NodeBundle::default()
}
}
步骤4:将constructivism模块添加到您的crate根目录
- 正如您所猜想的,本教程的根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:提供反馈
- 您所做的所有内容在大多数情况下都无法编译(因为我只测试了一个案例)。
- 前往github并写一个 问题 关于没有constructivism的生活多么艰难,并对这个该死的教程哭泣,因为这个教程根本按预期工作。
- (可选) 找到问题的根源并提供一个 漂亮的 PR。
步骤6:克服痛苦
- 您已经遵循了这个教程并多次实现了constructivism。
- 您想知道 - 为什么没有工具可以自动化所有这些步骤?
- 您意识到 - 是因为没有人为这些工具编写。
- 您实现了
cargo-bootstrap-constructivism
(向我询问如何做),提供令人惊讶的PR,并使这个crate变得更好。
许可证(无聊的)
该 constructivist
在以下两者之间双许可
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
- Apache许可证,版本2.0 (LICENSE-APACHE 或 http://apache.ac.cn/licenses/LICENSE-2.0)
这意味着您可以选择您喜欢的许可证!这种双许可方法在Rust生态系统中是事实标准,并且包括两者有非常好的原因。
依赖项
~0.6–1.1MB
~26K SLoC