在 Elixir 中,有没有办法让模块列出其功能?
In Elixir, is there any way to get a module to list its functions?
就像我们可以在Ruby中获取任何对象(或class)来列出其方法一样,Elixir中是否有任何功能可以列出属于模块的所有功能?像 String.functions
这样的东西(至少是远程的)(其中 String
可以替换为任何其他模块名称)?
Elixir 中的每个模块都定义了一个 __info__
函数,您可以调用该函数来获取有关该模块的信息。
根据Elixir Docs, 1.6.6 e.g.,你可以传递它:functions
来获取模块包含的函数列表。
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]
由于 Elixir 也是 Erlang,因此也有一种 Erlang 方法可以做到这一点。
每个 Elixir 和 Erlang 模块都有编译时定义的函数 module_info
时间。这个功能有两个方面。例如:
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>>]
您可以为 return 指定一个特定的属性。
iex(2)> Atom.module_info(:exports)
[__info__: 1, to_string: 1, to_char_list: 1, module_info: 0, module_info: 1]
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, ...]
这就是 IEx 自动完成功能使用的功能,它允许您扩展 Elixir 和 Erlang 功能。
我一直在使用 iex(1)> exports TargetModuleName
。它列出属于模块的所有函数和宏。我偶然发现了它,试图弄清楚如何阻止 Map.__info__(:functions)
截断一个长函数列表。
不是函数,而是让模块在 iex
中列出其函数的一种方法是写入模块名称,后跟 .
,然后点击制表符:
iex(1)> IO. ## Hit tab
ANSI Stream StreamError
binread/1 binread/2 binstream/2
binwrite/1 binwrite/2 chardata_to_string/1
getn/1 getn/2 getn/3
gets/1 gets/2 inspect/1
inspect/2 inspect/3 iodata_length/1
iodata_to_binary/1 puts/1 puts/2
read/1 read/2 stream/2
warn/1 warn/2 write/1
write/2
就像我们可以在Ruby中获取任何对象(或class)来列出其方法一样,Elixir中是否有任何功能可以列出属于模块的所有功能?像 String.functions
这样的东西(至少是远程的)(其中 String
可以替换为任何其他模块名称)?
Elixir 中的每个模块都定义了一个 __info__
函数,您可以调用该函数来获取有关该模块的信息。
根据Elixir Docs, 1.6.6 e.g.,你可以传递它:functions
来获取模块包含的函数列表。
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]
由于 Elixir 也是 Erlang,因此也有一种 Erlang 方法可以做到这一点。
每个 Elixir 和 Erlang 模块都有编译时定义的函数 module_info
时间。这个功能有两个方面。例如:
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>>]
您可以为 return 指定一个特定的属性。
iex(2)> Atom.module_info(:exports)
[__info__: 1, to_string: 1, to_char_list: 1, module_info: 0, module_info: 1]
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, ...]
这就是 IEx 自动完成功能使用的功能,它允许您扩展 Elixir 和 Erlang 功能。
我一直在使用 iex(1)> exports TargetModuleName
。它列出属于模块的所有函数和宏。我偶然发现了它,试图弄清楚如何阻止 Map.__info__(:functions)
截断一个长函数列表。
不是函数,而是让模块在 iex
中列出其函数的一种方法是写入模块名称,后跟 .
,然后点击制表符:
iex(1)> IO. ## Hit tab
ANSI Stream StreamError
binread/1 binread/2 binstream/2
binwrite/1 binwrite/2 chardata_to_string/1
getn/1 getn/2 getn/3
gets/1 gets/2 inspect/1
inspect/2 inspect/3 iodata_length/1
iodata_to_binary/1 puts/1 puts/2
read/1 read/2 stream/2
warn/1 warn/2 write/1
write/2