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

An Erlang guard sequence which checks if a term is a list of length == n

是否可以放置一个保护序列来检查术语类型及其长度?我读到第一个通过的守卫使整个序列通过,所以我想当我检查该术语是否为列表时,它不会检查其余的守卫。 这是代码:

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

    ok.

为了将保护表达式与 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.