不,Erlang 没有方法。 Erlang 有进程,而不是对象,您通过消息传递与它们通信,而不是在它们上调用方法。而已。仅此而已。
在 Erlang 中最接近 new 的意思是它在 Java 或 C++ 中的含义是 spawn。 (参数化模块讨论涉及的内容与您对 C++ 类型语言的期望非常不同,其中new 保留内存、调用构造函数等)
这实际上有两个方面:数据对象(如字典或列表或其他东西)和流程(您使用spawn 创建的东西)。
在一个函数定义中你可能会看到类似
SomeDict = dict:new(),
或
OtherDict = dict:from_list(KV_List)
这确实创建了一些东西,但它不是 Java 或 C++ 意义上的“对象”,它是(旧)意义上的“对象”,它是对内存中某物的命名引用。实际上,您与它的交互方式与您在上面演示的方式相同:
D = dict:new(),
ok = some_operation(D),
some_operation/1 可能是任何东西,无论是dict:foo() 还是其他东西。冒号之前的部分是模块标识符,告诉运行时你调用的函数存在于哪个命名空间——仅此而已。
另一件事,spawn,更像是 C++ 中的new,你想要创建一个完整的东西,它是有生命的,有胳膊和腿的——一个可以做详细事情的名词:
Pid = spawn(Mod, Fun, Args),
Pid ! {some, message},
大多数时候,您只能在原型或非 OTP 代码中看到 erlang:send/2 函数(也写为中缀 ! 运算符)。通常这是通过接口函数对您隐藏的,这些函数抽象出您一直在发送异步消息以与您的进程进行通信的事实。
如需更深入的解释,我推荐阅读Learn You Some Erlang——作者深入解释了这个和其他基本概念。
无论你做什么,都不要落入认为 Erlang 是 Java 的傻瓜陷阱。这只是打破自己的先入之见并感到沮丧的好方法。这可能是我看到人们犯的第一个初学者错误......