Erlang 为什么spawn()声称我的函数不存在?

Erlang 为什么spawn()声称我的函数不存在?,erlang,Erlang,我正在阅读这本书,代码如下: -module(fridge). %% API -export([start/1]). start(FoodList) -> spawn(?MODULE, fridge2, [FoodList]). fridge2(FoodList) -> receive {From, {store, _Food}} -> From ! {self(), ok}, fridge2([_Food|FoodList]);

我正在阅读这本书,代码如下:

-module(fridge).

%% API
-export([start/1]).

start(FoodList) -> spawn(?MODULE, fridge2, [FoodList]).

fridge2(FoodList) ->
  receive
    {From, {store, _Food}} ->
      From ! {self(), ok},
      fridge2([_Food|FoodList]);

    {From, {take, Food}} ->
      case lists:member(Food, FoodList) of
        true ->
          From ! {self(), {ok, Food}},
          fridge2(lists:delete(Food, FoodList));

        false ->
          From ! {self(), not_found},
          fridge2(FoodList)
      end;

    {terminate} ->
      ok
  end.
但是,当我尝试调用我的
start()
函数时,出现以下错误:

36> c(fridge).
fridge.erl:8: Warning: function fridge2/1 is unused
{ok,fridge}
37> fridge:start([]).
<0.111.0>

=ERROR REPORT==== 10-Mar-2016::22:02:42 ===
Error in process <0.111.0> with exit value:
{undef,[{fridge,fridge2,[[]],[]}]}
36>c(冰箱)。
冰箱。erl:8:警告:功能冰箱2/1未使用
{好的,冰箱}
37>冰箱:启动([])。
=错误报告===2016年3月10日::22:02:42===
使用退出值处理时出错:
{undf,[{冰箱,冰箱2,[[]],[]}}
我做错了什么,为什么它说函数不存在呢?

spawn(模块、函数、参数)->pid()

将Module:Function应用程序启动的新进程的pid返回给Args

因此,您必须将函数fridge2/1像start/1一样导出为api

或者我们这样写:

start(FoodList)->spawn(fun()->fridge2(FoodList)end)。

Ah非常有意义!我猜这个例子之所以奏效,是因为导出了所有的内容,尽管他们甚至说你应该只导出你需要的内容:)。lambda的好主意,也很有帮助。