【发布时间】:2016-12-04 04:07:46
【问题描述】:
是否可以放置一个保护序列来检查术语类型及其长度?我读到第一个通过的守卫使整个序列通过,所以我想当我检查这个术语是否是一个列表时,它不会检查其余的守卫。 代码如下:
save_key(Key)
when
is_list(Key);
length(Key) == 44 ->
ok.
【问题讨论】:
是否可以放置一个保护序列来检查术语类型及其长度?我读到第一个通过的守卫使整个序列通过,所以我想当我检查这个术语是否是一个列表时,它不会检查其余的守卫。 代码如下:
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.
【讨论】: