10个版本

0.4.1 2023年2月15日
0.4.0 2021年10月6日
0.4.0-beta.22020年7月5日
0.4.0-beta.02020年6月19日
0.1.0 2020年6月6日

#499 in 异步

每月下载量:37

MPL-2.0 许可证

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_2with-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