2009-08-29 12 views
2

受信文が複数のタイムアウト句を持つことは可能ですか?そうであれば正しい構文は何ですか?Erlang:複数のタイムアウト句を含む文を受信

私は小さいTimeout1またはTimeout2のかに応じ、doSomething1()またはdoSomething2が呼び出され、

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

のような何かをしたいです。ただし、上記のコードでは構文エラーが発生します。

私が疑い始めたように、これは不可能ですが、適切なErlangyのやり方で同じ結果を達成する最良の方法は何ですか?

ありがとうございます!

+0

可読性のために、空のreceive文の代わりに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これは他の方法で行うことができます(上記のようにするか、jldupontが示唆するように 'timer:send_after'を使用します)。パターンマッチとしても機能しません。私の解決策が示すように、ブランチは「マッチ」外で選択できます。そして、最後に、正しい方法であるため、できるだけ言語を小さくしています(それが私が好きな理由の1つです)。 –

0

あなたは、おそらく 'gen_fsm' と 'タイマー:send_after' の組み合わせを使用する必要があります。

関連する問題