假设我有一个像这样定义的Erlang actor:
counter(Num) ->
receive
{From, increment} ->
From ! {self(), new_value, Num + 1}
counter(Num + 1);
end.
Run Code Online (Sandbox Code Playgroud)
同样,我有一个像这样定义的Ruby类:
class Counter
def initialize(num)
@num = num
end
def increment
@num += 1
end
end
Run Code Online (Sandbox Code Playgroud)
Erlang代码以函数式编写,使用尾递归来维护状态.但是,这种差异的有意义影响是什么?对于我天真的眼睛来说,这两个东西的接口看起来大致相同:你发送一条消息,状态得到更新,然后你回来了一个新状态的表示.
函数式编程经常被描述为与OOP完全不同的范例.但是Erlang actor似乎完全按照对象应该做的:维护状态,封装并提供基于消息的接口.
换句话说,当我在Erlang actor之间传递消息时,它与我在Ruby对象之间传递消息的方式有何不同?
我怀疑功能/ OOP二分法的影响比我看到的要大.有谁可以指出他们?
让我们撇开这样一个事实,即Erlang actor将由VM调度,因此可以与其他代码同时运行.我意识到这是Erlang和Ruby版本之间的一个主要区别,但这不是我所得到的.在其他语言中可以实现并发,包括Ruby.虽然Erlang的并发性可能表现得非常不同(有时候会更好),但我并不是在询问性能差异.
相反,我对问题的功能与OOP方面更感兴趣.