2009-08-29 73 views
2

接收语句是否可能有多个超时子句,如果是,那么正确的语法是什么?Erlang:接收包含多个超时子句的语句

我要像做

foo(Timout1, Timeout2) -> 
    receive 
    after 
     Timeout1 -> 
      doSomething1(); 
     Timeout2 -> 
      doSomething2() 
    end. 

其中,取决于其Timeout1Timeout2较小,doSomething1()doSomething2被调用。但是,上面的代码会导致语法错误。

如果我开始怀疑这是不可能的,那么以合适的Erlangy方式达到相同结果的最佳方法是什么?

在此先感谢!

+0

为了便于阅读,您可能需要使用timer:sleep(Timeout)而不是空的接收语句。 – Zed

+0

谢谢 - 我没有包含任何接收子句,因为它们与此问题无关。 – grifaton

回答

4

不,你不能。收到之前,先决定做什么。

foo(Timeout1, Timeout2) -> 
    {Timeout, ToDo} = if Timeout1 < Timeout2 -> {Timout1, fun doSomething1/0}; 
         true -> {Timeout2, fun doSomething2/0} end, 
    receive 
    after Timeout -> ToDo() 
    end. 

foo(Timeout1, Timeout2) when Timeout1 < Timeout2 -> 
    receive 
    after Timeout1 -> doSomething1() 
    end; 
foo(_, Timeout2) -> 
    receive 
    after Timeout2 -> doSomething2() 
    end. 

+0

非常感谢。任何想法为什么Erlang缺少多个超时子句?对我来说,他们似乎使代码更清晰,更易于阅读。 – grifaton

+0

@grifaton简单,因为它可以通过其他方式完成(上面或者使用'timer:send_after'作为jldupont建议)。它甚至不能作为模式匹配,分支可以在我的解决方案显示的“匹配”之外选择。最后,他们保持语言尽可能小,因为它是正确的方式(这也是我喜欢它的一个原因)。 –

0

你或许应该用 '的gen_fsm' 的组合和 '定时器:send_after'。