ขณะนี้ฉันกำลังศึกษา Elixir และกำลังอ่าน "การพัฒนาเว็บเชิงฟังก์ชันด้วย Elixir, OTP และ Phoenix" ซึ่ง imo เป็นหนังสือที่ยอดเยี่ยม เมื่อทำงานที่บท state machine ฉันได้รหัสต่อไปนี้:
defmodule IslandsEngine.Rules do
alias __MODULE__
defstruct state: :initialized
def new(), do: %Rules{}
def check(%Rules{state: :initialized} = rules, :add_player), do:
{:ok, %Rules{rules | state: :players_set}}
def check(_state, _action), do: :error
end
โค้ดด้านบนควรทำงานเป็นเครื่องสถานะที่ทำงานได้อย่างสมบูรณ์ ฉันจะวางคำสั่ง iex ไว้ด้านบน:
iex(1)> alias IslandsEngine.Rules
IslandsEngine.Rules
iex(2)> rules = Rules.new()
%IslandsEngine.Rules{state: :initialized}
iex(3)> {:ok, rules} = Rules.check(rules, :add_player)
{:ok, %IslandsEngine.Rules{state: :players_set}}
iex(4)> rules.state
:players_set
อย่างที่คุณเห็น โครงสร้างสถานะได้เปลี่ยนจาก :initialized
เป็น :add_player
ยอดเยี่ยม.
คำถามของฉันคือ state:
struct ไม่เปลี่ยนรูปจริงหรือ ฉันหมายถึงว่าเมธอด check/1
ส่งคืนสำเนาของโครงสร้างด้วยคำสั่ง state: :players_set
ซึ่งเป็นไปตามรูปแบบการทำงานที่ถูกต้อง... แต่มันจะ "เขียนทับ" สถานะปัจจุบันโดยไม่ต้องแก้ไขโดยตรงได้อย่างไร
ขอบคุณมาก!