// ======================= library side =======================
// this is a simplified version of the actor trait
// a trait is something like an interface
trait Actor {
type Msg;
// the trait defines the recv function
// this function must be implemented by the user
// and gets called by the actor system when a message arrives
fn recv(&mut self, msg: Self::Msg);
}
// this is simplification of what happens when a message arrives for an actor
fn execute_message<A>(actor: &mut A, msg: A::Msg)
where A: Actor,
{
actor.recv(msg);
}
// this is a simplification of what happens when a message gets sent
fn send_message<A>(actor: &mut A, msg: A::Msg)
where A: Actor,
{
// normaly the message would first land in the messagebox of the actor
// when the actor starts it's work, it takes a message from the messagebox and executes it
// in order to simplify, we call execute directly
execute_message(actor, msg);
}
// ============================================================
// ======================== user side =========================
// User-defined actor struct
struct MyActor {
i: i32,
}
// the implementation of the Actor trait
impl Actor for MyActor {
type Msg = String;
fn recv(&mut self, msg: String) {
println!("i: {}, msg: {}", self.i, msg);
}
}
fn main() {
let mut a = MyActor { i: 10 };
send_message(&mut a, "test".to_string());
}
// ============================================================
Ly8gPT09PT09PT09PT09PT09PT09PT09PT0gbGlicmFyeSBzaWRlID09PT09PT09PT09PT09PT09PT09PT09CgovLyB0aGlzIGlzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHRoZSBhY3RvciB0cmFpdAovLyBhIHRyYWl0IGlzIHNvbWV0aGluZyBsaWtlIGFuIGludGVyZmFjZQp0cmFpdCBBY3RvciB7Cgl0eXBlIE1zZzsKCQoJLy8gdGhlIHRyYWl0IGRlZmluZXMgdGhlIHJlY3YgZnVuY3Rpb24KCS8vIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgdXNlcgoJLy8gYW5kIGdldHMgY2FsbGVkIGJ5IHRoZSBhY3RvciBzeXN0ZW0gd2hlbiBhIG1lc3NhZ2UgYXJyaXZlcwoJZm4gcmVjdigmbXV0IHNlbGYsIG1zZzogU2VsZjo6TXNnKTsKfQoKCgovLyB0aGlzIGlzIHNpbXBsaWZpY2F0aW9uIG9mIHdoYXQgaGFwcGVucyB3aGVuIGEgbWVzc2FnZSBhcnJpdmVzIGZvciBhbiBhY3RvcgpmbiBleGVjdXRlX21lc3NhZ2U8QT4oYWN0b3I6ICZtdXQgQSwgbXNnOiBBOjpNc2cpCgl3aGVyZSBBOiBBY3RvciwKewoJYWN0b3IucmVjdihtc2cpOwp9CgoKCi8vIHRoaXMgaXMgYSBzaW1wbGlmaWNhdGlvbiBvZiB3aGF0IGhhcHBlbnMgd2hlbiBhIG1lc3NhZ2UgZ2V0cyBzZW50CmZuIHNlbmRfbWVzc2FnZTxBPihhY3RvcjogJm11dCBBLCBtc2c6IEE6Ok1zZykKCXdoZXJlIEE6IEFjdG9yLAp7CgkvLyBub3JtYWx5IHRoZSBtZXNzYWdlIHdvdWxkIGZpcnN0IGxhbmQgaW4gdGhlIG1lc3NhZ2Vib3ggb2YgdGhlIGFjdG9yCgkvLyB3aGVuIHRoZSBhY3RvciBzdGFydHMgaXQncyB3b3JrLCBpdCB0YWtlcyBhIG1lc3NhZ2UgZnJvbSB0aGUgbWVzc2FnZWJveCBhbmQgZXhlY3V0ZXMgaXQKCS8vIGluIG9yZGVyIHRvIHNpbXBsaWZ5LCB3ZSBjYWxsIGV4ZWN1dGUgZGlyZWN0bHkKCWV4ZWN1dGVfbWVzc2FnZShhY3RvciwgbXNnKTsKfQoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKCgovLyA9PT09PT09PT09PT09PT09PT09PT09PT0gdXNlciBzaWRlID09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vIFVzZXItZGVmaW5lZCBhY3RvciBzdHJ1Y3QKc3RydWN0IE15QWN0b3IgewoJaTogaTMyLAp9CgovLyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFjdG9yIHRyYWl0CmltcGwgQWN0b3IgZm9yIE15QWN0b3IgewoJdHlwZSBNc2cgPSBTdHJpbmc7CglmbiByZWN2KCZtdXQgc2VsZiwgbXNnOiBTdHJpbmcpIHsKCQlwcmludGxuISgiaToge30sIG1zZzoge30iLCBzZWxmLmksIG1zZyk7Cgl9Cn0KCmZuIG1haW4oKSB7CglsZXQgbXV0IGEgPSBNeUFjdG9yIHsgaTogMTAgfTsKCXNlbmRfbWVzc2FnZSgmbXV0IGEsICJ0ZXN0Ii50b19zdHJpbmcoKSk7Cn0KCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ==