Listando as funções públicas de um módulo no Elixir

Dias atrás me perguntaram como listar as funções públicas de um módulo no Elixir e, quando me dei conta, vi que era possível e simples. Vamos conhecer?

Pois bem, é normal que quando a gente vá usar um determinado módulo, usemos sempre a tecla TAB para descobrir quais as funções que podemos aplicar e, claro, isso não é novidade, mas vamos por partes para entender melhor onde quero chegar.

Comece criando um arquivo matematica.ex com o seguinte conteúdo.

defmodule Matematica do
def soma_dois_numeros(a, b) do
a + b
end
def subtrai_dois_numeros(a, b) do
a - b
end
end

O conteúdo acima cria um módulo Matematica com duas funções públicas, soma_dois_numeros2 e subtrai_dois_numeros/2.

Muito bem, agora vamos iniciar o iex carregando esse módulo, para isso rode:

iex matematica.ex

Agora que carregamos o módulo podemos, tradicionalmente, digitar Matematica. e pressionar TAB duas vezes que ele mostrará quais são as funções públicas disponíveis.

iex(1)> Matematica.s
soma_dois_numeros/2 subtrai_dois_numeros/2

Pois bem, como dito anteriormente, nenhuma novidade até aqui.

O pulo do gato

Bom, usar o TAB é muito simples, mas e se quisermos fazer uma função para listar as funções do nosso módulo, ou mesmo usar o nome das funções contidas no módulo para fazer metaprogramação?

Bem, para isso podemos usar a função __info__/1 que é anexada a todo módulo compilado do Elixir. Veja:

iex(1)> Matematica.__info__(:functions)
[soma_dois_numeros: 2, subtrai_dois_numeros: 2]

Veja que a função devolveu uma keyword list, com o nome das funções e suas respectivas aridades.

Prontinho, com isso podemos, por exemplo, criar uma função para listar o nome das funções do módulo. Veja:

defmodule Matematica do
def soma_dois_numeros(a, b) do
a + b
end
def subtrai_dois_numeros(a, b) do
a - b
end
def listar_modulos do
Matematica.__info__(:functions)
end

end

Daí, após salvar o arquivo, é só recarregar o módulo e usar…

iex(1)> r(Matematica)
iex(2)> Matematica.listar_modulos
[listar_modulos: 0, soma_dois_numeros: 2, subtrai_dois_numeros: 2]

Prontinho! Agora você já sabe como listar a funções públicas de qualquer módulo via código. 😉

É isso, gente! Se quiser receber novidades como essa basta assinar nossa newsletter, e se quiser dar aquela força ao nosso projeto é só curtir nossa página no Facebook e nos seguir nas redes sociais. 😉