vida tutorial sinonimo programación lenguaje learn inmortal framework elixir

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.