进程字典

每个进程都拥有一个字典。通过下列BIF可以操作该字典:

put(Key,Value)
将与键Key相关联的新值Value加入进程字典。若与Key相关联的值已经存在则该值将被删除并被新值Value替代。该BIF返回原先与Key关联的值,若原先没有值与Key相关联,则返回undefinedKeyValue可以是任意的Erlang项式。
get(Key)
返回进程字典中与Key关联的值。若没有值与Key相关联则返回undefined
get()
{Key, Value}元组列表的形式返回整个进程字典。
get_keys(Value)
返回一个列表,包含进程字典中值为Value的所有的键。
erase(Key)
返回整个进程字典后将至删除。

对于各个进程而言进程字典是局部的。进程刚被创建时进程字典为空。任何函数都可通过调用put(Key,Value)向字典中添加{Key,Value}键值对,而后再通过调用get(Key)取出。在catch作用域内,若在调用put后调用throw或出现错误,放入字典的值不会被撤回。

借助get()erase()可以获取或删除整个字典。删除单个条目可用erase(Key)

有时候我们希望在多个不同函数中访问同一块全局数据,而将之作为进程中所有函数的参数来进行传递又不太方便。小心使用putget就可以避免这个问题。

getset在语言中引入了破坏性操作,令程序员写出具有副作用的函数。这些函数的调用结果可能跟它们的调用次序相关。对进程字典的使用应该非常小心getset就好比传统命令式语言里的gotogetset在某些特定场景下很有用,但使用它们会造成不清晰的代码,应该尽可能地避免使用。鉴于不鼓励使用进程字典,本书的所有程序都不使用进程字典——为了内容完整,只在此处和附录中包含相关内容。