Erlang actor与OOP对象有何不同?

rlk*_*024 11 ruby oop erlang functional-programming

假设我有一个像这样定义的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方面更感兴趣.

Dmi*_*aev 10

换句话说,当我在Erlang actor之间传递消息时,它与我在Ruby对象之间传递消息的方式有何不同?

区别在于像Ruby这样的传统语言没有消息传递,但是在同一个线程中执行的方法调用如果你有多线程应用程序,这可能会导致同步问题.所有线程都可以访问彼此的线程内存.

在Erlang中,所有actor都是独立的,改变另一个actor的状态的唯一方法是发送消息.没有进程可以访问任何其他进程的内部状态.

  • 是的,这是核心差异.在Ruby和其他传统语言中,他们**称它为消息传递,而在Erlang中它是**按摩传递. (6认同)