我正在学习Erlang,我正试图通过stdio输入的一些输入将消息从一个进程传递到另一个进程。
这是我的代码(我知道我可以使用普通函数,但这不是主题)。
-module(play).
-compile(export_all).
calculateArea() ->
receive
{rectangle, W, H,SenderPID} -> SenderPID ! {area,W * H};
{circle, R,SenderPID} -> SenderPID ! {area,3.14 * R * R};
_ -> io:format("We can only calculate area of rectangles or circles.")
end,
calculateArea().
doStuff() ->
CalculateArea = spawn(play,calculateArea,[]),
{ok,Width} = io:fread("Enter width","~d"),
{ok,Height} = io:fread("Enter height","~d"),
CalculateArea ! {rectangle,Width,Height,self()},
receive
{area,Size} -> io:write(Size)
end,
io:fwrite("done").
当我运行play:doStuff().
时,我收到{badarith,[{play,calculateArea,0,[{file,"play.erl"},{line,10}]}]}
错误。
我不明白为什么,根据文档,“〜d”会给我一个十进制值,如果我打印它肯定会是这样。
这里抓到了什么?
答案 0 :(得分:4)
io:fread
返回
Result = {ok, Terms :: [term()]}
| {error, {fread, FreadError :: io_lib:fread_error()}}
| server_no_data()
因此Width
和Height
将是包含单个数字的列表。使用{ok, [Width/Height]} = ...
进行修复。