次のように定義された 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 コードは、状態を維持するために末尾再帰を使用して、関数型スタイルで記述されています。しかし、この違いの意味のある影響は何ですか? 私の素朴な目には、これら 2 つのインターフェイスはほとんど同じように見えます。メッセージを送信すると、状態が更新され、新しい状態の表現が返されます。
関数型プログラミングは、OOP とはまったく異なるパラダイムであるとよく言われます。しかし、Erlang アクターは、状態を維持し、カプセル化し、メッセージベースのインターフェースを提供するという、オブジェクトが本来行うべきことを正確に行っているようです。
言い換えれば、Erlang アクター間でメッセージを渡す場合と、Ruby オブジェクト間でメッセージを渡す場合とでは、どのように違うのでしょうか?
機能/OOP の二分法には、私が見ているよりも大きな結果があるのではないかと思います。誰でもそれらを指摘できますか?
Erlang アクターが VM によってスケジュールされるため、他のコードと同時に実行される可能性があるという事実は脇に置いておきます。これが Erlang バージョンと Ruby バージョンの大きな違いであることは理解していますが、それは私が理解していることではありません。Ruby を含む他の言語でも同時実行が可能です。Erlang の同時実行性は非常に異なる (場合によってはより良い) パフォーマンスを発揮するかもしれませんが、私は実際にパフォーマンスの違いについて尋ねているわけではありません。
むしろ、私は質問の機能対 OOP 側にもっと興味があります。