【问题标题】:An Erlang guard sequence which checks if a term is a list of length == n一个 Erlang 保护序列,用于检查项是否为长度 == n 的列表
【发布时间】:2016-12-04 04:07:46
【问题描述】:

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

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

    ok.

【问题讨论】:

    标签: erlang guard


    【解决方案1】:

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

    【讨论】:

    • 谢谢,伙计,这正是我所需要的!
    猜你喜欢
    • 2019-12-28
    • 1970-01-01
    • 2021-03-13
    • 2014-12-29
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    相关资源
    最近更新 更多