【发布时间】:2013-02-15 09:00:20
【问题描述】:
假设我有一个像这样定义的 Erlang 演员:
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 代码以函数式风格编写,使用尾递归来维护状态。但是,这种差异的有意义的影响是什么?在我天真的眼里,这两件事的接口似乎很相似:发送消息,更新状态,然后返回新状态的表示。
函数式编程经常被描述为与 OOP 完全不同的范式。但 Erlang actor 似乎完全按照对象应该做的事情去做:维护状态、封装并提供基于消息的接口。
换句话说,当我在 Erlang actor 之间传递消息时,它与我在 Ruby 对象之间传递消息时有何不同?
我怀疑功能/OOP 二分法的后果比我看到的要大。谁能指出来?
让我们抛开 Erlang actor 将由 VM 调度并因此可能与其他代码同时运行这一事实。我意识到这是 Erlang 和 Ruby 版本之间的主要区别,但这不是我想要的。并发在其他语言中是可能的,包括 Ruby。虽然 Erlang 的并发性能可能非常不同(有时更好),但我并不是真的在问性能差异。
相反,我对问题的功能与 OOP 方面更感兴趣。
【问题讨论】:
-
IMO 该示例太小/孤立,无法显示有意义的差异。显然,在这种情况下,概念上的差异很小。在这个简单的例子中,其他考虑因素更为重要。
标签: ruby oop functional-programming erlang