【问题标题】:Erlang: calling rr(?MODULE) from beam executable?Erlang:从梁可执行文件调用 rr(?MODULE)?
【发布时间】:2013-03-08 01:06:32
【问题描述】:

我不完全确定如何在 Erlang 模块中定义 Erlang 函数。我收到以下错误:

11> invoke_record:invoke().
** exception error: undefined function erlang:rr/1

从这个简单的代码尝试从 beam 可执行文件中调用 rr(?MODULE). 以“初始化”记录,这样就不需要每次都从 shell 调用它。

-module(invoke_record).
-export([invoke/0]).
-record(process, {pid,
                reference="",
                lifetime=0
                }).
invoke() ->
    erlang:rr(?MODULE).

【问题讨论】:

    标签: function erlang initialization record


    【解决方案1】:

    rr("file.hrl"). 命令只能在 shell 中用于调试目的。

    正如其他用户在他们的回答中强调的那样,在您的 erlang 代码中导入 .hrl 文件中包含的记录(或函数)的正确方法是使用命令 -include("file.hrl')

    一旦您在代码中包含了.hrl 文件(通常在基于OTP 行为的模块中,这在-export(...) 部分之后完成),您就可以毫无问题地引用Erlang 记录(或函数)。

    【讨论】:

    • “一旦你在代码中包含了 hrl 文件,你就可以毫无问题地引用 erlang 记录(或函数)”。不,只有你特意说了这个。如果我错了,请告诉我。
    • 我稍微改变了我的答案,以便您知道将 -include() 部分放在 OTP 文件中的哪个位置。
    【解决方案2】:

    rr 是一个 shell 命令。你不能用它编译的代码。

    http://www.erlang.org/doc/man/shell.html

    【讨论】:

    • 这太糟糕了……还有其他方法可以让生活更简单吗?
    • 我认为有,让我谷歌...
    • 总有某种方式。 Erlang 是一门相当成熟的语言。
    • 对不起,我没有找到解决办法。我虽然你可以使用.erlang 启动文件,但它不起作用。
    • 为什么不在编译前在源文件中添加带有该记录定义的头文件?
    【解决方案3】:

    如果您的意图是在 shell 中读取许多记录定义,为了方便调试,您可以编写一个包含所有需要的包含语句的文件,并在 shell 中简单地调用一次 rr。

    在 rec.hrl 中:

    -include("include/bank.hrl").
    -include("include/reply.hrl").
    

    在shell中

    1> rr("rec.hrl").
    [account,reply]
    2>
    

    在启动 VM 时,我没有找到任何自动执行此操作的方法。

    【讨论】:

      【解决方案4】:

      在处理项目时,您可以将所有必要的包含和其他命令行参数收集到纯文本文件中,以用于该特定项目。制作纯文本文件后,您可以启动您的 shell:

      erl -args_file FileName
      

      其中 FileName 是纯文本文件的名称。请注意,允许 erl 接受的所有命令行参数。另请参阅the ERTS Reference Manual 中的 erl 标志

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-24
        • 1970-01-01
        • 2014-10-14
        • 2010-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多