一个Erlang保护序列,它检查一个术语是否是长度== n的列表

时间:2016-07-29 12:26:52

标签: erlang guard

是否可以设置一个可以检查术语类型及其长度的保护序列?我读到第一个传球后卫使整个序列通过,所以我想当我检查这个术语是一个列表时,它并没有检查其余的守卫。 这是代码:

save_key(Key)
    when
      is_list(Key);
      length(Key) == 44 ->

    ok.

1 个答案:

答案 0 :(得分:4)

为了将保护表达式与and结合起来,您可以使用逗号而不是分号来区分它们here

-module(a).
-export([save_key/1]).

save_key(Key)
    when
      is_list(Key),
      length(Key) == 44 ->
    ok;
save_key(_) ->
    ko.
1> c(a).
{ok,a}
2> a:save_key([]).
ko
3> a:save_key(nil).
ko
4> a:save_key(lists:seq(1, 44)).
ok

另请注意,由于忽略了警卫中引发的错误,您只需添加length(Key) == 44并获得与非列表相同的行为将引发错误并且与该子句不匹配:

save_key(Key) when length(Key) == 44 ->
    ok;
save_key(_) ->
    ko.