Elixir 結(jié)構(gòu)體的底層是映射

2023-12-15 14:54 更新
在上述例子中,模式匹配之所以能成功,是因?yàn)榻Y(jié)構(gòu)體的底層是被鎖定了領(lǐng)域的映射.作為映射,結(jié)構(gòu)體擁有一個(gè)"特殊"的領(lǐng)域叫做__struct__,里面是結(jié)構(gòu)體的名字:
iex> is_map(john)
true
iex> john.__struct__
User

注意我們稱結(jié)構(gòu)體是裸露的映射,因?yàn)樗袑?duì)映射生效的協(xié)議,結(jié)構(gòu)體都不可用.例如,你既不能枚舉也不能進(jìn)入一個(gè)結(jié)構(gòu)體:

iex> john = %User{}
%User{age: 27, name: "John"}
iex> john[:name]
** (UndefinedFunctionError) undefined function: User.fetch/2
iex> Enum.each john, fn({field, value}) -> IO.puts(value) end
** (Protocol.UndefinedError) protocol Enumerable not implemented for %User{age: 27, name: "John"}

然而,結(jié)構(gòu)體也是映射,能夠使用?Map?模塊中的函數(shù):

iex> kurt = Map.put(%User{}, :name, "Kurt")
%User{age: 27, name: "Kurt"}
iex> Map.merge(kurt, %User{name: "Takashi"})
%User{age: 27, name: "Takashi"}
iex> Map.keys(john)
[:__struct__, :age, :name]


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)