代码之家  ›  专栏  ›  技术社区  ›  spc16670

列出Erlang中进程可用的记录

  •  0
  • spc16670  · 技术社区  · 10 年前

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

    我想做的是:

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

    get_record(汽车)-> %%这里有一些神奇的东西 {car,{make,honda}}或甚至更好的#car{}。%当Car=“Car”时

    3 回复  |  直到 10 年前
        1
  •  2
  •   juan.facorro    10 年前

    正如您所说的,记录只是一个编译时构造,所以一旦编译的记录只是元组,这意味着在运行时不会留下任何可用信息,但由于您提到了这两个函数,我很好奇,并检查了它们是如何工作的。

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

    另一方面 is_record(Term, RecordTag) 声明仅此BIF(内置函数) “返回” true 如果 Term 是一个元组,其第一个元素是 RecordTag , false 否则” ,因此它实际上只是检查元组的结构和第一个元素。

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

        2
  •  1
  •   MichaelMilom    10 年前

    我使用过Dynarec( https://github.com/dieswaytoofast/dynarec.git )在我目前正在开发的一个应用程序的数据映射模块中成功。它是一个解析转换器,但不是一个运行时VM工具。它编译每个已定义记录的信息,以及每个记录的字段信息。在我的例子中,我使用它来动态地将传入数据映射到记录数据。本模块可能会满足您的需求。YMMV。祝你好运

        3
  •  1
  •   rvirding    10 年前

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