Erlang有方法吗?

时间:2015-04-10 01:24:56

标签: erlang

E.g。是这样的:

O = widget:new(),
O:whirl()

我似乎记得看到一些像这样的代码(也许我在想象它),但我没有在我读过的教程中看到它。从我所看到的,最接近的是:

O = widget:new(),
widget:whirl(O)

这不是太糟糕,但不必在第二个表达式中重复widget:会很好。

2 个答案:

答案 0 :(得分:2)

不,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。这只是一个很好的方式来绊倒你自己的先入之见并感到沮丧。这可能是我看到人们犯下的#1初学者错误......

答案 1 :(得分:2)

这是参数化模块的语法,removed from Erlang in R16 (2012)