2013-10-18 85 views
1

我需要打印出一個值,如果它是零以上:打印值,如果它是不爲零

info({mail, BoxPid, Messages, MessageCount, MessageDropCount}, Req, S) -> 
    if MessageDropCount > 0 -> 
      io:format("dropped=~p~n", [MessageDropCount]); 
     true -> true 
    end, 
    ..., 
    {loop, Req, S}; 

我不喜歡if表達的true -> true一部分。有沒有辦法避免它?有沒有一個成語呢?

回答

3

If Then page at the ErlangCentral wiki表明這些模式:

  • [io:format("dropped=~p~n", [MessageDropCount]) || MessageDropCount > 0]
  • MessageDropCount > 0 andalso io:format("dropped=~p~n", [MessageDropCount])
  • MessageDropCount =< 0 orelse io:format("dropped=~p~n", [MessageDropCount])
2

您CA使用功能與模式匹配:

info({mail, BoxPid, Messages, MessageCount, MessageDropCount}, Req, S) -> 
    printIfNotZero(MessageDropCount,"dropped=~p~n"), 
    ..., 
    {loop, Req, S}; 

... 
printIfNotZero(0,_) -> ok; 
printIfNotZero(C,M) -> io:format(M, [C]). 

編輯:更廣泛的功能可能是以下幾點:

info({mail, BoxPid, Messages, MessageCount, MessageDropCount}, Req, S) -> 
    printCond(MessageDropCount =/= 0,"dropped=~p~n",[MessageDropCount]), 
    ..., 
    {loop, Req, S}; 

... 
printCond(false,_,_) -> ok; 
printCond(true,Format,Arglist) -> io:format(Format,Arglist). 
+0

我想甚至可以說更通用的變種是: '如果(假的,_) - > 確定; 。 如果(真,動作) - > 動作()' 使用等: '如果(MessageDropCount> 0,有趣() - > IO:格式( 「下降=〜P〜n」 個,[MessageDropCount] )end雖然實際上我的印象是你和我的解決方案對於一般用法來說過於冗長/繁瑣,而且MessageDropCount> 0,並且io:format(「dropped =〜p〜n」 ,[MessageDropCount])'勝。 – erszcz

+0

是的,但我試圖直接回答Akonsu問題。我懷疑問題與應用程序中發生的某些事件的日誌有關;我已經使用了多種解決方案,從無條件控制檯打印到具有一堆事件處理程序的gen_event的使用,以便在控制檯,文件或圖形界面中進行登錄。提供比詢問更多的信息總是一種誘惑,但......簡短是美好的 – Pascal

相關問題