Methods in Erlang
Erlang supports functions defined on modules, which is somewhat similar to methods in object-oriented languages.
-module(rect).
-export([new/2, area/1, perim/1]).
new(Width, Height) ->
#{width => Width, height => Height}.This area function takes a rect map as its argument.
area(#{width := Width, height := Height}) ->
Width * Height.Functions can be defined to work with different data structures. Here’s an example using a map.
perim(#{width := Width, height := Height}) ->
2 * Width + 2 * Height.Here’s how we can use these functions:
main() ->
R = rect:new(10, 5),
% Here we call the 2 functions defined for our rect.
io:format("area: ~p~n", [rect:area(R)]),
io:format("perim: ~p~n", [rect:perim(R)]),
% Erlang doesn't have pointers, so there's no distinction between
% value and reference semantics as in some other languages.
% The same functions work on the same data structure.
io:format("area: ~p~n", [rect:area(R)]),
io:format("perim: ~p~n", [rect:perim(R)]).To run this program:
$ erlc rect.erl
$ erl -noshell -s rect main -s init stop
area: 50
perim: 30
area: 50
perim: 30In Erlang, we define functions that operate on data structures, rather than methods that are associated with objects. The concept of receiver types doesn’t exist in Erlang, as it’s not an object-oriented language. Instead, we pass the data structure as an argument to our functions.
Erlang’s pattern matching in function heads allows us to easily work with different data structures, providing a flexible way to define behavior for different types of data.
Next, we’ll look at Erlang’s mechanisms for defining behaviors and callbacks, which serve a similar purpose to interfaces in some other languages.