我目前正在学习Elixir,并阅读《使用Elixir、OTP和Phoenix进行函数式Web开发》这本书,我认为这是一本很棒的书。 在状态机章节工作时,我编写了以下代码:
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:
结构确实是不可变的吗?我的意思是,方法check/1
返回带有state: :players_set
语句的结构副本,遵循正确的函数模式...但是它如何在不直接修改它的情况下“覆盖”当前状态呢?非常感谢!