25 · Máquinas de Estado
Ações de Transição
Blocos de código que executam automaticamente quando uma transição ocorre.
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