我正在编写一个用户必须输入“是”或“否”值的程序。以下是收到消息{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);
执行时,显示“姓名新病人......”行,但不显示“是/否”行,程序排序崩溃,因为如果发送了另一条消息,则不会执行该消息。有没有不同的方法可以解决这个问题?
答案 0 :(得分:3)
我想在这里提出一些观点:
io:read/1
函数读取一个术语,而不仅仅是一行,因此您必须使用'。'来终止输入。 (比如在shell中)。io:read/1
会返回{ok,Term}
或{error,Reason}
或eof
,因此您的代码应检查这些值,例如使用case
。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)