ruby - Erlang actor 与 OOP 对象有何不同?

标签 ruby oop functional-programming erlang

假设我有一个这样定义的 Erlang actor:

counter(Num) ->
  receive
    {From, increment} ->
      From ! {self(), new_value, Num + 1}
      counter(Num + 1);
  end.    

同样,我有一个这样定义的 Ruby 类:

class Counter
  def initialize(num)
    @num = num
  end

  def increment
    @num += 1
  end
end

Erlang 代码以函数式风格编写,使用尾递归来维护状态。然而,这种差异的有意义的影响是什么?在我天真的眼中,这两个事物的接口(interface)看起来非常相似:您发送一条消息,状态得到更新,然后您返回新状态的表示。

函数式编程经常被描述为与 OOP 完全不同的范例。但是 Erlang actor 似乎做的正是对象应该做的事情:维护状态、封装并提供基于消息的接口(interface)。

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

我怀疑功能/OOP 二分法的后果比我看到的要大。谁能指出来?

让我们撇开 Erlang actor 将由 VM 调度并因此可能与其他代码并发运行这一事实。我意识到这是 Erlang 和 Ruby 版本之间的主要区别,但这不是我要表达的意思。其他语言也可以实现并发,包括 Ruby。虽然 Erlang 的并发性能可能有很大不同(有时更好),但我并不是真的要问性能差异。

相反,我对问题的功能与 OOP 方面更感兴趣。

最佳答案

In other words, when I am passing messages between Erlang actors, how is it different than when I'm passing messages between Ruby objects?

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

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

关于ruby - Erlang actor 与 OOP 对象有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15147924/

相关文章:

ruby - 如何使交互式 Ruby 程序更好?

ruby-on-rails - 将 Rails 代码放入 jQuery

functional-programming - 是否有纯粹的声明性通用编程语言?

ruby - 在 Windows 的命令行中安装 github-pages gem 时出错

ruby - 计数方法在 Ruby 中如何工作?

c++ - 在 C++ 中重载 setter/getter ?

ruby - 猴子补丁核心类的替代品

r - 在环境中使用 UseMethod 进行方法分派(dispatch)

python - 更实用的python

java - 将 Dataset<Row> 中的行映射到对象类 Spark Java