2022年9月9日金曜日

Ruby state machine 超入門

Ruby state machine 超入門

概要

Ruby の state_machines gem を使ってオブジェクトの状態遷移を行ってみました
動きを確認できる簡単なサンプルコードを紹介します

環境

  • macOS 11.6.8
  • Ruby 3.1.2p20
    • state_machines 0.5.0

インストール

  • vim Gemfile
gem "state_machines"
  • bundle install

サンプルコード

require 'state_machines'

class Instance
  # 初期状態を定義します
  # 今回は初期状態は wait とします
  # イベントによる遷移先の定義はブロック内で行います
  # 今回は wait -> creating -> running というシンプルな状態遷移を考えます
  state_machine :state, initial: :wait do
    # run がコールされたら creating 状態にします (インスタンスの作成)
    event :run do
      transition wait: :creating
    end
    # complete がコールされたら running 状態にします (インスタンスの作成完了)
    event :completed do
      transition creating: :running
    end
    # cancel がコールされたら wait 状態にします (インスタンスの作成キャンセル)
    event :cancel do
      transition creating: :wait
    end
    # delete がコールされた wait 状態にします (インスタンスの削除)
    event :delete do
      transition running: :wait
    end
  end
end

# 動作確認
ins = Instance.new
puts ins.state  # => wait
ins.run
puts ins.creating? # => true
ins.completed
puts ins.running? # => true
ins.delete
puts ins.wait? # => true
ins.run
ins.cancel
puts ins.wait? # => true

少し解説

コード内のコメントを追うのが一番いいかなと思うので少しだけ補足します

event メソッドで状態が遷移するイベントを定義します
そのイベントが発生したら transition で状態の遷移先を定義します
transition は「今の状態」「次の状態」という2つの引数で定義します

もし今の状態からの遷移先がない場合は現在の状態に留まります (例えば wait 状態で cancel イベントが発生しても wait のまま)

最後に

次回はこの Ruby ファイルから状態遷移図を作成する方法を紹介します

参考サイト

0 件のコメント:

コメントを投稿