我是erlang的新学习者,我正在寻找一本名为Introducing erlang
的书。在本书中,它有一些例子如下:
-module(ask).
-export([term/0]).
term() ->
Input = io:read("What {planemo, distance} ? >>"),
process_term(Input).
process_term({ok, Term}) when is_tuple(Term) ->
Velocity = drop:fall_velocity(Term),
io:format("Yields ~w. ~n",[Velocity]),
term();
process_term({ok, quit}) ->
io:format("Goodbye.~n");
% does not call term() again
process_term({ok, _}) ->
io:format("You must enter a tuple.~n"),
term();
process_term({error, _}) ->
io:format("You must enter a tuple with correct syntax.~n"),
term().
以下是调用ask
模块的示例:
6> c(ask).
{ok,ask}
7> ask:term().
What {planet, distance} ? >>{mars,20}.
Yields 12.181953866272849.
What {planet, distance} ? >>20.
You must enter a tuple.
What {planet, distance} ? >>quit.
Goodbye.
ok
我不明白为什么What {planet, distance} ? >>quit.
与process_term({ok, quit})
功能匹配?你只输入'quit'
,而不是元组,
我认为它不应该与process_term({ok, quit})
函数匹配。那里有人可以解释原因吗?
答案 0 :(得分:4)
根据io:read/1
(http://www.erlang.org/doc/man/io.html#read-1)的文档,它返回一个元组{ok, Term}
。即,您输入 foo ,io:read
返回{ok, foo}
,您输入{bar, 10}
,io:read
返回{ok, {bar, 10}}
。
所有process_term
子句在{ok, _whatever the user typed_}
上匹配,或者如果某些内容失败,则{error, Reason}
(这是所有Erlang样式)。
答案 1 :(得分:0)
此外,在您的代码中,您有process_term({ok, Term}) when is_tuple(Term) ->
获取输入,前提是它是一个元组,因此是when
子句。当您输入'退出'时,它不必是{ok, quit}
接受的元组,它与它们匹配并返回输出。
希望这会有所帮助。