1个不稳定版本

0.1.0 2021年1月31日

#1603异步

MIT 许可证

6KB
80

chikatetsu

为tokio提供的另一个actor框架。

为什么?

大多数其他actor框架使用某种形式的dyn Any,这基本上是在告诉编译器,“去你的类型检查,我这里有Box”。

我们不是使用动态派发,而是生成一个枚举,其中包含actor将处理的可能的所有消息类型。这是通过一个derive宏自动完成的,并且在幕后处理,因此从技术上讲,你永远不会需要在代码中使用生成的枚举(见下面的示例)。

use chikatetsu::prelude::*;

#[derive(PartialEq, Debug)]
pub struct Add(i32, i32);
#[derive(PartialEq, Debug)]
pub struct AddResult(i32);

#[derive(PartialEq, Debug)]
pub struct Subtract(i32, i32);
#[derive(PartialEq, Debug)]
pub struct SubtractResult(i32);

/*
Generated enums:
pub enum MathActorMessages {
    Add(Add),
    Subtract(Subtract),
}

pub enum MathActorReplies {
    AddResult(AddResult),
    SubtractResult(SubtractResult),
}
*/

#[derive(Actor)]
#[handles(Add, AddResult)]
#[handles(Subtract, SubtractResult)]
struct MathActor;

#[async_trait]
impl Handler<Add> for MathActor {
    async fn handle(&mut self, add: Add) -> AddResult {
        AddResult(add.0 + add.1)
    }
}

#[async_trait]
impl Handler<Subtract> for MathActor {
    async fn handle(&mut self, add: Subtract) -> SubtractResult {
        SubtractResult(add.0 - add.1)
    }
}

#[tokio::main]
async fn main() {
    let actor = MathActor.start();

    assert_eq!(AddResult(3), actor.send(Add(1, 2)).await);
    assert_eq!(SubtractResult(-1), actor.send(Subtract(1, 2)).await);
}

依赖项

~2.7–9MB
~75K SLoC