2011-11-16 83 views
1

我正在编写一个程序,用户必须输入“是”或“否”值。以下是在收到消息{createPatient,PatientName}时将执行的代码。但该行不显示是/否和程序排序崩溃,因为如果被发送另一条消息Erlang如何接受字符串?

{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

您可以发布'患者'代码和崩溃日志吗? – Isac

+0

患者实际上被执行并且直到那一点它工作正常...在“新患者名称”显示之后,实际上并没有什么不寻常的事情发生......命令提示符号码将增加,并且事实上“甚至没有”提示甚至没有被写入......然后,无论我输入什么输入,它都会回声它回来...没有任何处理。 – ict1991

+1

io:read用于读取erlang术语,因此您必须用点结束输入。虽然“是/否”信息应该打印到标准输出,但不知道为什么不是。你如何执行你的程序?直接从shell? – Isac

回答

3

有一些点,我想在这里提出:

  • io:read/1函数读取的术语,不只是一条线,所以你必须终止输入了“” (如在外壳中)。
  • io:read/1返回{ok,Term}{error,Reason}eof所以你的代码应该检查这些值,例如用case
  • 正如@AlexeyRomanov所述,io:get_line/1可能是更好的输入选择。
  • if表达式必须处理所有的情况,即使你不想做任何事情的情况下,否则你会得到一个错误。这可以与测试读取值的case结合使用。
  • 你产卵功能patient:newPatient/1之前你问,如果这个名字是新患者,这看起来有点奇怪。 newpatient函数是做什么的?无论如何,它也会对用户造成干扰,可能会干扰这里的功能吗?

主要的问题似乎是弄清楚什么是在什么地方,什么时候做什么。

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}. 

和壳牌行动:

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

有可能创造一些对话与外壳(即使是unix shell),但说实话,它的使用非常罕见,我不记得那些带有读和写的I/O技巧写。 http://trapexit.com/曾经有这个东西的食谱。