Erlang和io:read()

时间:2015-01-31 13:51:07

标签: erlang

我有问题,我不知道为什么程序无法正常工作。 当我运行程序并插入atom c时,程序将永远调用函数io:read()

感谢您的帮助,对不起我的英语。

-module(temperature).
-export([run/0, convert/2]).

run() ->
   run(true).

run(true) ->
  {ok, Choice} = io:read("Convert to degrees Celsius or convert to degrees Fahrenheit? c/f :"),
  {ok, Temp} = io:read("Insert temperature: "),
  {UnitTemp, Convert} = convert(Choice, Temp),
  io:format("The converted temperature: ~f ~s\n", [Convert, UnitTemp]),
  {ok, Continue} = io:read("New temperature? true/false :"),
  run(Continue);

run(false) ->
  ok.

convert(c, Fahrenheit) -> {'Celsius', 5 * (Fahrenheit - 32) / 9};
convert(f, Celsius) -> {'Fahrenheit', 9 * Celsius / 5 + 32}.

1 个答案:

答案 0 :(得分:1)

io:read读取一个字词,因此在您使用.完成约会之前,它不会停止。

1> io:read("Enter term: ").
Enter term: {foo, bar}.
{ok,{foo,bar}}
2> io:read("This will give error: ").
This will give error: }foo
This will give error: .
{error,{1,erl_parse,["syntax error before: ","'}'"]}}

所以你只需输入c.

或者,如果您不想键入点,则可以使用io:get_chars/2。第一个参数是提示,第二个参数是要读取的字符数,因此在您的情况下,它将是:

io:get_chars("prompt ", 1).
prompt c
"c"

请记住,在输入c之后,您仍然必须按Enter键,现在,您应该在字符串"c"而不是原子c上进行模式匹配。