Erlang切换(case)的可分性

时间:2016-02-19 12:49:25

标签: erlang

我想使用Erlang来确定传递给函数的变量是否可以被数字整除。我考虑过使用case来做这件事,但解决方案却让我望而却步。 case是否适合这份工作?

示例:将数字传递给函数f()。如果该数字可被10整除,则打印一个语句。如果它可被15整除,则打印不同的语句。如果它可以被5整除,我想我想打印第三个陈述,但不是“可以被10整除”或“可以被15整除”的陈述,因为案件已经处理完毕。

我的直觉告诉我case适合这份工作,但我是Erlang的新手并且在将它拼凑在一起时遇到了麻烦。

1 个答案:

答案 0 :(得分:4)

您可以在函数子句中使用警卫执行此操作:

f(N) when N rem 10 =:= 0 ->
    io:format("divisible by 10~n");
f(N) when N rem 15 =:= 0 ->
    io:format("divisible by 15~n");
f(N) when N rem 5 =:= 0 ->
    io:format("divisible by 5~n").

或者您可以使用if表达式执行此操作:

f(N) ->
    if N rem 10 =:= 0 ->
        io:format("divisible by 10~n");
       N rem 15 =:= 0 ->
        io:format("divisible by 15~n");
       N rem 5 =:= 0 ->
        io:format("divisible by 5~n")
    end.

如果您从其他地方获取号码,使用case表达式可能更为自然:

f() ->
    case get_number() of
        N when N rem 10 =:= 0 ->
            io:format("divisible by 10~n");
        N when N rem 15 =:= 0 ->
            io:format("divisible by 15~n");
        N when N rem 5 =:= 0 ->
            io:format("divisible by 5~n")
    end.

请注意,如果数字不能被5整除,所有这些表达式都会崩溃。这在Erlang中通常被认为是好的风格:如果你的函数在输入错误时无法做任何事情,那么让它崩溃会更好并让调用者处理错误,而不是使代码复杂化,并在每个级别上处理错误。当然,这取决于您的具体要求。