假设我定义了一个这样的 Erlang actor:
Erlang代码采用函数式风格编写,使用尾递归来维护状态。然而,这种差异的有意义影响是什么?在我看来,这两个东西的接口似乎大致相同:您发送消息,状态得到更新,然后您会收到新状态的表示。
函数式编程经常被描述为与OOP完全不同的范例。但是,Erlang actor似乎正好做到了对象应该做的事情:维护状态,封装并提供基于消息的接口。
换句话说,当我在Erlang actor之间传递消息时,与我在Ruby对象之间传递消息有何不同?
我怀疑函数式/OOP二元性具有比我看到的更大的影响。有人能指出吗?
让我们暂且放下Erlang actor将由VM调度并因此可能与其他代码并发运行的事实。我意识到这是Erlang和Ruby版本之间的主要区别,但这不是我的重点。并发在其他语言中也是可能的,包括Ruby。虽然Erlang的并发可能表现非常不同(有时更好),但我真正想问的不是性能差异。
相反,我更感兴趣的是函数式与OOP方面的问题。
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方面的问题。