运行两个模块中的代码时,Erlang进程出现undef错误

wtlkbnrh  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(169)

我有两个文件,processescalc(根据形状计算面积)。我是Erlang的新手,现在,我只想运行processes文件,该文件创建进程并从calc文件/模块调用area()。
代码如下:
calc.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().

processes.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]).

当我在编译并运行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,[],[]}]}

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

9rygscc1

9rygscc11#

让我们检查错误:上面写着

{undef, [{processes, area, [], []}]}

这意味着没有参数的函数area[])没有在模块processes中定义(undef)。
这个函数是在calc模块中定义的,对吗?
所以,如果你改变...

PID = spawn(processes, area, []).

...到...

PID = spawn(calc, area, []).

......你应该没问题:)

额外提示

1.您不需要 import 任何东西(例如io:fwrite/1calc:area/0,以便使用它们-特别是,因为您是以完全限定的方式使用它们)。import 在Erlang中有不同的含义,实际上,根本不推荐使用它。

  • 使用Camel_Case作为变量并没有错,但是使用它更符合 * 习惯 *...
  • 变量的PascalCase
  • snake_case表示原子(包括函数和模块名称)
  • SCREAMING_SNAKE_CASE用于宏

相关问题