列出 Erlang 中进程可用的可用记录

Posted

技术标签:

【中文标题】列出 Erlang 中进程可用的可用记录【英文标题】:Listing available records available to a process in Erlang 【发布时间】:2014-08-09 12:15:50 【问题描述】:

记录是编译时结构。 record_info 和 is_record 识别已编译的记录及其结构。有没有办法询问 VM 已定义哪些记录可用于进程?我有兴趣获取每个记录定义的内部元组表示。

我想做的是这样的:

-记录(汽车,make=honda)。

get_record(汽车) -> %% 这里有一些神奇的东西,最终会有类似的东西 car,make,honda 甚至更好的#car。 %% 当 Car = 'car'

【问题讨论】:

【参考方案1】:

正如你所说的记录只是一个编译时构造,所以一旦编译的记录只是元组,这表明在运行时没有可用的信息,但是由于你提到了这两个函数,我很好奇,我检查了它们是如何工作的。

根据thisrecord_info/2 是一个伪函数,仅在编译期间可用,因此它不需要任何关于记录的运行时信息。

另一方面,is_record(Term, RecordTag) 的描述表明,如果Term 是一个元组并且它的第一个元素是RecordTag,@987654332,则此 BIF(内置函数)只有 “返回 true @ else",所以实际上只是检查元组的结构和第一个元素。

基于此,我猜想在运行时没有可用的记录信息。 This thread 确认 record_info/2 在运行时不可用。

【讨论】:

record_info/2 是在编译期间自动创建的,它可以随时访问,尤其是在运行时。根据documentation you are pointing to. @mpm 我看不到我所指的文档在哪里说 record_info/2 在运行时可用。您只需在定义了记录的模块中调用 Module:module_info(functions) 即可检查这一点,您将见未定义record_info/2 @mpm 请检查this thread,确认record_info/2 在运行时不可用。 我的立场是正确的。不知何故,我必须混淆 record_info/2 可以用 shell 中的 rr 函数做什么(这有点神奇的地方 and manages to do it from time to time )。如果您对答案添加任何修改,我将能够删除“投票反对”。【参考方案2】:

我已在我目前正在开发的应用程序之一的数据映射模块中成功使用了 Dynarec (https://github.com/dieswaytoofast/dynarec.git)。不过,它是一个解析转换器,而不是运行时 VM 工具。它编译每条已定义记录的信息,以及每条记录的字段信息。就我而言,我使用它来动态映射传入数据以记录数据。该模块可能会为您提供所需的东西。 YMMV。祝你好运。

【讨论】:

是的,确实如此,这正是我所追求的,但我想确保没有解析转换就无法获得它。该库的代码看起来非常整洁。我有很多用于日志记录模块的解析转换 - 无论如何都更大。谢谢! 哦,你会怎么做:get_record_name(#car) -> car。 ? 在该特定情况下,只需查看记录的元组形式的第一个元素。 #foobar = baz 在代码中仍然表示为 foo, baz。 谢谢,我没有意识到我可以做到 Name,_ = Car。【参考方案3】:

正如其他人所说,记录纯粹是编译时间,没有关于记录的运行时信息。 Erlang 只看到元组。例如,record_info/2 伪函数在编译时扩展为数据,fields 参数为原子列表,size 为整数。

【讨论】:

以上是关于列出 Erlang 中进程可用的可用记录的主要内容,如果未能解决你的问题,请参考以下文章

为啥常见的 Erlang 应用程序(Common Test、Dialyzer、leex、yecc 等)在 `erl` shell 中不可用?

rabbitmq高可用实现

Erlang复合数据结构基础之元组与列表

linuxmint18 apt-get install 导致锁不可用

如何列出要注入 grails 的可用对象?

rabbitMQ和对应的erlang版本匹配