tutorial - En Elixir, ¿hay alguna forma de obtener un módulo para enumerar sus funciones?
elixir tutorial (3)
De la misma manera que podemos obtener cualquier objeto (o clase) en Ruby para enumerar sus métodos, ¿hay alguna función en Elixir para enumerar todas las funciones que pertenecen a un módulo?
¿Algo (al menos de forma remota) como
String.functions
(donde
String
podría reemplazarse por cualquier otro nombre de módulo)?
Cada módulo en Elixir define una función
__info__
que puede llamar para obtener información sobre ese módulo.
De acuerdo con
Elixir Docs, 1.6.6, por ejemplo
, puede pasarlo
:functions
para obtener una lista de funciones que contiene el módulo.
Map.__info__(:functions)
[delete: 2, drop: 2, equal?: 2, fetch: 2, fetch!: 2, from_struct: 1, get: 2,
get: 3, has_key?: 2, keys: 1, merge: 2, merge: 3, new: 0, pop: 2, pop: 3,
put: 3, put_new: 3, size: 1, split: 2, take: 2, to_list: 1, update: 4,
update!: 3, values: 1]
Dado que Elixir también es Erlang, hay una forma de Erlang de hacer esto también.
Cada módulo de Elixir y Erlang tiene la función
module_info
definida en tiempo de compilación.
Hay dos aridades de esta función.
Por ejemplo:
iex(1)> Atom.module_info
[module: Atom,
exports: [__info__: 1, to_string: 1, to_char_list: 1, module_info: 0,
module_info: 1], attributes: [vsn: [66271031909514292894123295368320335064]],
compile: [options: [:debug_info], version: ''6.0.1'',
time: {2015, 9, 29, 2, 34, 37},
source: ''/private/tmp/elixir20150928-10892-fvin6a/elixir-1.1.1/lib/elixir/lib/atom.ex''],
native: false,
md5: <<49, 219, 86, 35, 141, 153, 70, 174, 245, 100, 68, 5, 62, 231, 60, 216>>]
Puede especificar un atributo específico para devolver.
iex(2)> Atom.module_info(:exports)
[__info__: 1, to_string: 1, to_char_list: 1, module_info: 0, module_info: 1]
Verificación de la función Erlang:
iex(3)> :crypto.module_info(:exports)
[version: 0, stop: 0, supports: 0, info_lib: 0, hash: 2, hash_init: 1,
hash_update: 2, hash_final: 1, hmac: 3, hmac: 4, hmac_init: 2, hmac_update: 2,
hmac_final: 1, hmac_final_n: 2, block_encrypt: 4, block_encrypt: 3,
block_decrypt: 3, next_iv: 2, next_iv: 3, stream_init: 3, stream_init: 2,
stream_encrypt: 2, stream_decrypt: 2, rand_bytes: 1, strong_rand_bytes: 1,
rand_bytes: 3, rand_uniform: 2, rand_seed: 1, mod_pow: 3, verify: 5, sign: 4,
public_encrypt: 4, private_decrypt: 4, private_encrypt: 4, public_decrypt: 4,
exor: 2, generate_key: 2, generate_key: 3, compute_key: 4, md5: 1, md5_init: 0,
md5_update: 2, md5_final: 1, md4: 1, md4_init: 0, md4_update: 2, md4_final: 1,
sha: 1, sha_init: 0, sha_update: 2, ...]
Esto es lo que utiliza la función de autocompletar IEx que le permite expandir las funciones de Elixir y Erlang.
He estado usando
iex(1)> exports TargetModuleName
.
Enumera todas las funciones y macros que pertenecen a un módulo.
Me topé con él tratando de descubrir cómo evitar que
Map.__info__(:functions)
truncara una larga lista de funciones.