2015-02-22 8 views

Odpowiedz

62

Każdy moduł w Elixir definiuje funkcję __info__, którą możesz wywołać, aby uzyskać informacje o tym module.

Zgodnie z Elixir Docs, można go przekazać :functions, aby uzyskać listę funkcji, które zawiera ten moduł.

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] 
+4

Aktualizacja: zmiana mojej odpowiedzi na użycie ': functions' zamiast': exports'. Obie działają, ale '': functions' wygląda najlepiej, zgodnie z dokumentami. –

+0

Czy istnieje również sposób na uzyskanie go w kolejności zdefiniowanej w module? Jest teraz uporządkowany alfabetycznie. – Phillipp

20

Ponieważ Elixir to również Erlang, istnieje sposób, aby to zrobić Erlang.

Każdy moduł Elixir i Erlang ma funkcję module_info zdefiniowaną podczas kompilacji czasu. Istnieją dwie arytmy tej funkcji. Na przykład:

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>>] 

Można określić konkretny atrybut do zwrócenia.

iex(2)> Atom.module_info(:exports) 
    [__info__: 1, to_string: 1, to_char_list: 1, module_info: 0, module_info: 1] 

Erlang funkcja Verison:

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, ...] 

To właśnie funkcja autouzupełniania iex wykorzystuje który pozwala rozszerzyć funkcje zarówno Elixir i Erlang.

Powiązane problemy