Erlang案例陈述

Erlang case statement

我有下面的Erlang代码,当我试图编译它时,它给出如下警告,但这是有意义的。函数需要两个参数,但我需要patten匹配"其他一切",而不是x、y或z。

1
2
3
4
5
6
7
8
9
10
11
12
-module(crop).
-export([fall_velocity/2]).

fall_velocity(P, D) when D >= 0 ->
case P of
x -> math:sqrt(2 * 9.8 * D);
y -> math:sqrt(2 * 1.6 * D);
z -> math:sqrt(2 * 3.71 * D);
(_)-> io:format("no match:~p~n")
end.

crop.erl:9: Warning: wrong number of arguments in format call.

在io:format之后我尝试了一个匿名变量,但它仍然不高兴。


在您使用~p的格式中,它意味着——打印值。因此,必须指定要打印的值。

最后一行必须是

1
_ -> io:format("no match ~p~n",[P])

另外,io:format返回'ok'。因此,如果p不是x y或z,函数将返回"OK"而不是数值。我建议返回标记值,以区分正确和错误返回。有点

1
2
3
4
5
6
7
8
fall_velocity(P, D) when D >= 0 ->
case P of
x -> {ok,math:sqrt(2 * 9.8 * D)};
y -> {ok,math:sqrt(2 * 1.6 * D)};
z -> {ok,math:sqrt(2 * 3.71 * D)};
Otherwise-> io:format("no match:~p~n",[Otherwise]),
            {error,"coordinate is not x y or z"}
end.


为了明确另一个答案的注释,我将这样编写函数:

1
2
3
4
5
6
7
8
9
-module(crop).
-export([fall_velocity/2]).

fall_velocity(P, D) when D >= 0 ->
    case P of
        x -> math:sqrt(2 * 9.8 * D);
        y -> math:sqrt(2 * 1.6 * D);
        z -> math:sqrt(2 * 3.71 * D)
    end.

也就是说,不要在case表达式中处理不正确的参数。如果有人将foo作为参数传递,您将得到错误{case_clause, foo}以及指向此函数及其调用方的stacktrace。这也意味着,由于使用不正确的参数调用,此函数不能将不正确的值泄漏到代码的其余部分。

如另一个答案一样,返回{ok, Result} | {error, Error}同样有效。您需要选择最适合您的情况的变体。