Ações de Transição
Nesta página
Cada transição pode carregar um bloco de ação escrito entre chaves logo após
o nome do evento: A -> B on evento { ... }. O bloco executa de forma síncrona
depois que a transição é decidida, mas antes de .send retornar — ideal para
efeitos colaterais coesos com a mudança de estado (logs, pulsos de hardware,
gatilhos de animação).
Porta com quatro transições, cada uma imprimindo uma mensagem ao disparar.
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
Mantenha os blocos pequenos. Para trabalho mais pesado, prefira lançar uma
corrotina com spawn dentro da ação em vez de bloquear o send.
Veja também