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. |
号
- 我会抛出一个例外,或者可能只是不检查任何其他的X,Y,Z。尔朗失败了可以理解,没有必要过度。
- 正确的。但如果不进行检查,您可以在比调用函数晚得多的某个地方得到一个错误。好的,r=下降速度(a,b)可能更早地指出一个错误。
- erlang.se/doc/programming_rules.shtml参考32551
- 实际上,这取决于谁调用函数。如果函数是API的一部分,则确实欢迎使用标记值。但是,如果函数是代码库内部的一个内部部分,那么您最终会发现到处都有case语句,不断地检查您自己的代码,这是一个不必要的麻烦。就让它失败吧。
- 这是很容易检查的事情之一,所以"他们"决定为它添加一个警告检查。这只是一个警告,所以如果您决定忽略它,那么在运行代码时会得到一个错误。
为了明确另一个答案的注释,我将这样编写函数:
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}同样有效。您需要选择最适合您的情况的变体。