Erlang (и Elixir) часто в шутку называют самым труъ-ООП языком программирования. При этом под объектной ориентацией (ОО) понимают определение, которое дал Алан Кей, автор языка программирования Smalltalk и один из отцов-основателей ООП. Согласно ему, объекты представляют собой изолированные сущности с защищённым (скрытым) состоянием, которые общаются между собой только путём передачи сообщений. Согласитесь, как будто бы описание процессов Erlang/Elixir!

Широкое же распространение другого определения ("Encapsulation, Inheritance, Polymorphism") связано с популярностью С++ и Java, а также языков, на которых они оказали влияние. Если отбросить аспект наследования, в рамках этого определения объекты — это экземпляры классов, которые обладают одновременно внутренним состоянием (переменные экземпляра) и поведением (методы класса/экземпляра). Как пример можно привести следующую интерактивную сессию Ruby:

irb(main):001:0> str = String.new("Some string")
=> "Some string"
irb(main):002:0> str.split
=> ["Some", "string"]

Здесь мы создаём объект, который обладает некоторым состоянием (внутреннее представление строки "Some string"). Кроме того, он знает, как разбивать строку по разделителям (метод String#split).

Можно ли добиться такого же поведения (хотя бы визуально) в Elixir? Ответ — можно!