Erlang 如果值不是零,则打印该值
如果大于零,我需要打印一个值:Erlang 如果值不是零,则打印该值,erlang,Erlang,如果大于零,我需要打印一个值: info({mail, BoxPid, Messages, MessageCount, MessageDropCount}, Req, S) -> if MessageDropCount > 0 -> io:format("dropped=~p~n", [MessageDropCount]); true -> true end, ..., {loop, Req, S};
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
部分。有办法避免吗?有这样的习惯用法吗?您可以使用具有模式匹配的函数:
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).
报告提出了以下模式:
[io:format(“drop=~p~n”,[MessageDropCount])| | MessageDropCount>0]
MessageDropCount>0和其他io:format(“droped=~p~n,[MessageDropCount])
MessageDropCount=<0或lse io:format(“droped=~p~n,[MessageDropCount])
if(false),ok;if(true,Action)->Action()。
的用法类似于:if(MessageDropCount>0,fun()->io:format(“drop=~p~n”,“MessageDropCount])end)。
不过,事实上,我觉得你的和我的解决方案对于一般用法来说都过于冗长/繁琐,MessageDropCount>0以及io:format(“drop=~p~n”,[MessageDropCount])
wins。是的,但我试图直接回答Akonsu的问题。我怀疑问题与应用程序中发生的某些事件的日志有关;我使用了多种解决方案,从无条件控制台打印到使用gen_事件以及一系列事件处理程序登录控制台、文件甚至图形I面对面。提供比要求更多的信息总是一种诱惑,但是……简短是美丽的