Предположим, что у меня есть актер Эрланга, подобный этому:
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 написан в функциональном стиле, используя хвостовую рекурсию для поддержания состояния. Однако каково существенное влияние этой разницы? Для моих наивных глаз интерфейсы к этим двум вещам кажутся одинаковыми: вы отправляете сообщение, состояние обновляется, и вы возвращаете представление нового состояния.
Функциональное программирование так часто описывается как совершенно другая парадигма, чем ООП. Но актер Erlang, похоже, делает именно то, что должны делать объекты: поддерживать состояние, инкапсулировать и предоставлять интерфейс на основе сообщений.
Другими словами, когда я передаю сообщения между актерами Erlang, как это отличается от того, когда я передаю сообщения между объектами Ruby?
Я подозреваю, что для дихотомии функционального/ООП есть большие последствия, чем я вижу. Может ли кто-нибудь указать на них?
Отложите в сторону тот факт, что актер Erlang будет назначен VM и, таким образом, может работать одновременно с другим кодом. Я понимаю, что это большое различие между версиями Erlang и Ruby, но это не то, что я получаю. Concurrency возможен на других языках, включая Ruby. И хотя Erlang Concurrency может работать очень по-другому (иногда лучше), я не спрашиваю о различиях в производительности.
Скорее, меня больше интересует сторона функционального-vs-ООП вопроса.