我想使用 Erlang 来确定传递给函数的变量是否可以被数字整除。我已经考虑case过这样做,但是,解决方案让我望而却步。是case适合这项工作的工具吗?
示例:将一个数字传递给函数 f()。如果数字能被 10 整除,则打印一个语句。如果它可以被 15 整除,则打印不同的语句。如果它可以被 5 整除,我想我想打印第三个语句,但不是“可被 10 整除”或“可被 15 整除”的语句,因为该案例已经处理完毕。
我的直觉告诉我case适合这份工作,但我是 Erlang 的新手,很难将它拼凑起来。
你可以在你的函数子句上使用警卫来做到这一点:
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").
Run Code Online (Sandbox Code Playgroud)
或者你可以用一个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.
Run Code Online (Sandbox Code Playgroud)
如果您从其他地方获取数字,则使用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.
Run Code Online (Sandbox Code Playgroud)
请注意,如果数字不能被 5 整除,所有这些表达式都会崩溃。 这在 Erlang 中通常被认为是好的风格:如果您的函数无法对错误的输入做任何明智的事情,最好让它崩溃并让调用者处理错误而不是通过处理各个级别的错误使您的代码复杂化。当然,这取决于您的具体要求。