从两个模块运行代码时,Erlang 进程给出 undef 错误

Ris*_*mar 2 erlang

我有两个文件,processes并且calc(根据形状计算面积)。我是 Erlang 的新手,现在我只想运行processes创建进程并从calc文件/模块调用 area() 的文件。

代码如下:

计算.erl:

- module(calc).
- export([start/0, area/0]).
- import(io, [fwrite/1]).

start() ->
    % Pid = spawn(fun() -> loop(Args here) end), 
    PID = spawn(calc, area, []),
    io:fwrite("PID: ~w", [PID]).
    % PID ! {self(), {rectangle, 10, 20}},

area() ->
    receive
        {From , {rectangle, X, Y}} ->
            From ! {rectangle, X*Y};
        {From, {square, X}} ->
            io:fwrite("in the Square area!"),
            From ! {square, X*X}
    end,
    area().
Run Code Online (Sandbox Code Playgroud)

进程.erl:

-module(processes).
-export([execute/0]).
-import(io,[fwrite/1]).
-import(calc, [area/0]).

execute() ->
    PID = spawn(processes, area, []),
    Square_Area = PID ! {self(), {square, 10}},
    receive
        {rectangle, Area} ->
            io:fwrite("Rectangle area: ~w", [Area]);
        {square, Area} ->
            io:fwrite("Square area: ~w", [Area]);
        Other ->
            io:fwrite("In Other!")
    end,
    io:fwrite("Yolo: ~w", [Square_Area]).
Run Code Online (Sandbox Code Playgroud)

当我在编译并运行processes.erl文件后运行命令时processes:execute().,出现以下错误:

=ERROR REPORT==== 4-Sep-2022::20:24:26.720042 ===
Error in process <0.87.0> with exit value:
{undef,[{processes,area,[],[]}]}
Run Code Online (Sandbox Code Playgroud)

这是因为第二个文件没有被加载还是我写了错误的命令?任何帮助将不胜感激!

小智 6

让我们检查一下错误:它说

\n
{undef, [{processes, area, [], []}]}\n
Run Code Online (Sandbox Code Playgroud)\n

area这意味着没有参数的函数( []) 未undef在模块中定义 () processes。准确地说,该错误意味着此类函数未从该模块导出

\n

哪个是对的。该函数是在模块中定义的calc,对吗?

\n

所以,如果你改变\xe2\x80\xa6

\n
PID = spawn(processes, area, []).\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\xa6 到 \xe2\x80\xa6

\n
PID = spawn(calc, area, []).\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\xa6你应该没问题:)

\n

\xe2\x84\xb9 额外提示

\n
    \n
  1. 您不需要导入任何内容(例如io:fwrite/1calc:area/0为了使用它们 - 特别是,因为您以完全限定的方式使用它们)。import在 Erlang 中具有不同的含义,实际上,根本不建议使用它。
  2. \n
  3. 使用for 变量并没有错,但使用\xe2\x80\xa6\nCamel_Case惯用
      \n
    • PascalCase对于变量
    • \n
    • snake_case对于原子(包括函数和模块名称)
    • \n
    • SCREAMING_SNAKE_CASE对于宏
    • \n
    \n
  4. \n
\n