10个版本
0.4.1 | 2023年2月15日 |
---|---|
0.4.0 | 2021年10月6日 |
0.4.0-beta.2 | 2020年7月5日 |
0.4.0-beta.0 | 2020年6月19日 |
0.1.0 | 2020年6月6日 |
#499 in 异步
每月下载量:37
12KB
85 行
spaad
Spooky action at a distance
spaad是一个crate,它消除了xtra(一个微型演员框架)中的大量样板代码。它是通过一个proc宏:spaad::entangled
来实现的。结果是,编写消息处理程序和调用它几乎与传统的函数调用相同。
例如,处理程序看起来像这样
#[spaad::entangled]
impl MyActor {
async fn print(&mut self) { /* ... */ }
}
并且可以像这样调用
my_actor.print().await;
用法
spaad::entangled
是spaad的核心项目。它根据处理程序的签名创建消息和Handler
实现,以及一个封装地址的结构体,该结构体具有用于发送消息的直观函数名。最终结果是,调用者和被调用者看起来都没有涉及任何演员。crate的名称是一个俏皮的引用,爱因斯坦所说的量子纠缠——“spooky action at a distance”——因为在量子纠缠中,一个粒子的状态似乎也“神奇”地改变了。
此宏用作演员结构定义及其impl块的属性。
示例
use xtra::prelude::*;
#[spaad::entangled]
pub struct Printer {
times: usize,
}
#[spaad::entangled]
impl Actor for Printer {}
#[spaad::entangled]
impl Printer {
#[spaad::spawn]
pub fn new() -> Self {
Printer { times: 0 }
}
#[spaad::handler]
pub fn print(&mut self, to_print: String) {
self.times += 1;
println!(
"Printing {}. Printed {} times so far.",
to_print, self.times
);
}
}
#[tokio::main]
async fn main() {
// a Spawner must be provided as the last argument here
let printer = Printer::new(&mut xtra::spawner::Tokio::Global);
loop {
printer.print("hello".to_string()).await;
}
}
实际上,生成的Printer
类型并不包含结构体的所有成员,而是它的地址。实际的结构是严格内部的,只能通过发送消息或从其impl块内部进行交互。当在impl块内部作为类型引用时,必须使用Self
,因为它将被重命名。
需要注意的是,new
函数是一个特殊情况。如果存在,进程宏还将为演员包装器生成一个 create
方法,对应于 Actor::create
。它可以接受参数。如果启用了 with-tokio-0_2
或 with-async_std-1_0
功能,则还会生成一个 new
方法,对应于 Actor::spawn
。
如果您不想等待消息完成处理,可以这样做
let _ = my_actor.print(); // Binding to avoid #[must_use] warning on Future
对于更复杂的示例,例如处理演员的断开连接并在处理程序中获取 Context
,请参阅文档或示例目录中的 complex.rs
。要查看生成的代码,请在 example_generated
文件夹中运行 cargo +nightly doc
。
优点
- 更直观和简洁。
- IDE 支持。在某些 IDE 中(仅在带有 Rust 插件的 IntelliJ IDEA 上进行了测试)可以跳转到定义。这仅是部分支持,因为在某些情况下,IDE 不理解
self
参数的可变性变化(在发送消息时仅需要&self
,但它看起来像声明为&mut self
)。 - 可以使用 nightly API,并且不太可能发生 UB(通过在 GATs 中删除 UB 的机会),并且完全透明。
缺点
- 与 xtra 本身有类似的注意事项:不成熟。
- IDE 支持并不完整。在某些情况下,可能会出现问题。这可能可以通过进程宏展开来解决,但这似乎还遥不可及。虽然 Rust Analyzer 在处理此问题方面可能比 IntelliJ Rust 好一些,但这可能有所变化。
nightly API
为了启用 xtra 的 nightly API,请禁用 Cargo.toml
中的默认 stable
功能。
版本兼容性
Spaad 0.4.0 与 xtra 0.5.0 兼容。
依赖关系
~1.5–2.2MB
~42K SLoC