2009-08-29 75 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'。