你如何接受Erlang中的字符串?

时间:2011-11-16 15:22:53

标签: erlang io

我正在编写一个用户必须输入“是”或“否”值的程序。以下是收到消息{createPatient,PatientName}时将执行的代码。

{createPatient, PatientName} ->
    Pid = spawn(patient,newPatient,[PatientName]),
    register(PatientName,Pid),
    io:format("*--- New Patient with name - ~w~n", [PatientName]),
    Result = io:read("Yes/No> "),
    {_,Input} = Result,
    if(Input==yes) ->
        io:format("OK")
    end,
    loop(PatientRecords, DoctorPatientLinks, DoctorsOnline, CurrentPatientRequests, WaitingOfflineDoctorRequests);

执行时,显示“姓名新病人......”行,但不显示“是/否”行,程序排序崩溃,因为如果发送了另一条消息,则不会执行该消息。有没有不同的方法可以解决这个问题?

3 个答案:

答案 0 :(得分:3)

我想在这里提出一些观点:

  • io:read/1函数读取一个术语,而不仅仅是一行,因此您必须使用'。'来终止输入。 (比如在shell中)。
  • io:read/1会返回{ok,Term}{error,Reason}eof,因此您的代码应检查这些值,例如使用case
  • 正如@AlexeyRomanov所说,io:get_line/1可能是更好的选择。
  • if表达式必须处理所有情况,即使是您不想做任何事情的情况,否则您将收到错误。这可以与case测试读取值结合使用。
  • 你生成函数patient:newPatient/1 之前你问这个名字是否是新病人,这看起来有点奇怪。 newpatient函数有什么作用?无论如何它也在向用户提供可能干扰功能的用户吗?

主要问题似乎是解决在何处以及何时进行的工作。

答案 1 :(得分:1)

这是非常人为的问题。在erlang中,任何通信通常都是进程间的,并且交换字符串是没有任何意义的 - 你在进程A的上下文中提出问题,并且你想在进程B的上下文中发布回答(可能是shell)。

无论如何,考虑提问并在接收区中等待以获得答案。 当问题在shell中弹出时,请调用一个函数,该函数会将答案发送给“询问”。处理你的答案。

所以:

io:format("*--- New Patient with name - ~w~n", [PatientName]),
receive
  {answer, yes} -> do_something();
  {answer, no} -> do_something()
end

回答'功能看起来像那样:

answer(PatientName, Answer) ->
   PatientName ! {answer, Answer}.

和shell行动:

$> *--- New Patient with name - User1036032
$> somemodule:answer('User1036032', yes).

可以使用shell创建一些对话框(甚至是unix shell),但说实话,它的使用非常罕见,以至于我不记得那些带有读写的I / O技巧。 http://trapexit.com/曾经有过这本书的食谱。

答案 2 :(得分:0)

改为使用io:get_line("Yes/No> ")