热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在Elixir中,有没有办法让模块列出其功能?

如何解决《在Elixir中,有没有办法让模块列出其功能?》经验,为你挑选了3个好方法。

就像我们可以在Ruby中获取任何对象(或类)来列出其方法一样,Elixir中是否有任何函数列出属于模块的所有函数?有东西(至少是远程的)String.functions(String可以用任何其他模块名称替换)?



1> Steven Schob..:

Elixir中的每个模块都定义了一个__info__函数,您可以调用该函数来获取有关该模块的信息.

根据Elixir Docs,1.6.6例如,您可以传递它: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]


更新:改变我的答案使用`:functions`而不是`:exports`.根据文档,两者都有效,但``functions`看起来是最好的选择.

2> Fred the Mag..:

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

您可以指定要返回的特定属性.

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

Erlang功能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, ...]

这就是IEx自动完成功能使用的功能,允许您扩展Elixir和Erlang功能.



3> sheepgobeep..:

我一直在用iex(1)> exports TargetModuleName。它列出了属于模块的所有功能和宏。我偶然发现它试图找出如何停止Map.__info__(:functions)截断长函数列表。


推荐阅读
author-avatar
手机用户2502855107
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有