Acciones de Transición
En esta página
Cada transición puede llevar un bloque de acción escrito entre llaves justo
después del nombre del evento: A -> B on evento { ... }. El bloque se ejecuta
de forma síncrona después de que la transición es decidida, pero antes de que
.send retorne — ideal para efectos secundarios cohesivos con el cambio de estado
(logs, pulsos de hardware, disparadores de animación).
Puerta con cuatro transiciones, cada una imprimiendo un mensaje al dispararse.
02-actions.zolo
// Feature: transition actions — code that runs on transition
// Syntax: `A -> B on event { <body> }`. The block runs after the
// transition is decided but before `.send` returns.
// When to use: side effects tied to state changes — log lines,
// hardware pulses, animation triggers, audio events.
machine Door {
state Closed, Open, Locked
initial Closed
Closed -> Open on open { print("door opened") }
Open -> Closed on close { print("door closed") }
Closed -> Locked on lock { print("door locked") }
Locked -> Closed on unlock { print("door unlocked") }
}
let door = Door.new()
print(door.state) // expected: Closed
door.send("open") // expected: door opened
print(door.state) // expected: Open
door.send("close") // expected: door closed
print(door.state) // expected: Closed
door.send("lock") // expected: door locked
print(door.state) // expected: Locked
door.send("unlock") // expected: door unlocked
print(door.state) // expected: Closed
Mantén los bloques pequeños. Para trabajo más intenso, prefiere lanzar una
corrutina con spawn dentro de la acción en lugar de bloquear send.
Consulta también