Aridade

Normalmente você verá as funções com essa representação map/2 ou Enum.map/2. Esse número após a barra se chama aridade. Ela vem da matemática onde significa o número de argumentos ou de operandos que uma função ou operação requer.

Ele tem o mesmo significado no Elixir. Ele indica quantos argumentos essa função necessita para ser executada. No exemplo acima temos o Enum.map/2. Leia-se que a função map do módulo Enum precisa de dois argumentos para poder ser utilizado.

Isso serve para as funções que você cria também. Vamos a um exemplo. Teremos uma função simples chamada multiple do módulo Math que multiplica 2 números x e y.

Podemos representar isso dessa forma Math.multiple/2. Uma vez que você passe isso para alguém que entenda de aridade, ele entenderá o que é necessário para essa função.

Vamos ao teste

test/math_test.exs
defmodule MathTest do
  use ExUnit.Case
  
  describe "multiple/2" do
    test "success: return the result" do
      assert Math.multiple(3, 5) == 15
    end
  end
end

Rodando isso teremos um relatório de erro pois não possuímos a função.

mix test test/math_test.exs    
warning: Math.multiple/2 is undefined or private
  test/math_test.exs:6: MathTest."test multiple/2 success: return the result"/1



  1) test multiple/2 success: return the result (MathTest)
     test/math_test.exs:5
     ** (UndefinedFunctionError) function Math.multiple/2 is undefined or private
     code: assert Math.multiple(3, 5) == 15
     stacktrace:
       (hello_world 0.1.0) Math.multiple(3, 5)
       test/math_test.exs:6: (test)


Finished in 0.02 seconds (0.00s async, 0.02s sync)
1 test, 1 failure

Agora que possuímos a representação e o teste de nossa função, vamos criar a implementação dela.

Tudo funcionando. Mas, sabendo que nossa função é dois de aridade, o que acontece quando mandamos apenas um argumento? Vamos criar um teste para isso

Quando não encontra uma função com a especificação enviada, recebemos uma exceção dizendo que função não foi definida. Também recebemos uma sugestão de que talvez o que queremos seja a função multiple/2 e não multiple/1.

Podemos fazer esse teste passar dizendo que esperamos que falhe quando isso aconteça. Vamos alterar nosso teste para esperar por iso.

Executando isso, teremos sucesso nos testes

Também podemos usar a aridade para escolher a função a ser rodada de mesmo nome. Vamos fazer outro teste.

Você pode rodar e ver que o módulo e função não foram definidas. Vamos cria-la.

Agora vamos supor que só mande o primeiro nome.

O relatório de erro avisa que não temos uma função say_my_name de aridade 1 (say_my_name/1) e sugestiona a outra que criamos no exemplo anterior say_my_name/1. Para fazer esse teste passar, precisamos criar uma nova função say_my_name que suporte receber apenas um argumento.

Diferente de algumas linguagem de programação, Elixir suporte multiplas definições de uma mesma função.

Vamos criar essa nova função

Rodando o teste agora, você terá um relatório de sucesso.

Quando chamamos uma função que tem mais de uma definição ela irá começar da primeira definição a que esta mais ao topo do aqruivo para baixo, parando na primeira oportunidade.

Então, devemos levar em consideração a posição que a função é declarada.

Conclusão

Aridade é uma representação matemática que utilizamos para definir o número de argumentos que uma função necessidade para ser executada.

Last updated

Was this helpful?