我可以做我自己的卫队在二郎山?(Can I make my own Guards in Erlang

2019-06-25 17:44发布

我来到防空火炮在网络上这样的代码:

is_char(Ch) ->         
    if Ch < 0 -> false;  
       Ch > 255 -> false;
       true -> true      
    end.

is_string(Str) ->            
    case is_list(Str) of           
    false -> false;           
    true -> lists:all(is_char, Str)
    end.

它是保护我alwais梦见掉,因为它会检查是否输入是一个字符串 - 怎么过的,我不能在二郎山使用它,这是为什么? 而且有一个变通?

我想能写这样的东西:

Fun(Str) when is_string(Str) -> Str;
Fun(Int) when is_integer(Int) -> io:format("~w", [Int]).

甚至更好的使用它的消息。

Answer 1:

你不允许在警卫使用用户定义的函数。 这是因为在后卫的职能必须从副作用(如使用免费io:format在你的函数)。 在守卫,你只限于以下内容:

  • 用于类型测试(内建函数is_atomis_constantis_floatis_integeris_listis_numberis_pidis_portis_referenceis_tupleis_binaryis_functionis_record ),
  • 布尔操作符( notandorandalsoorelse,; ),
  • 关系运算符( >>=<=<=:====/=/= ),
  • 算术运算符( +- *divrem
  • 位运算符( bandborbxorbnotbslbsr ),
  • 其它的BIF是自由的副作用( abs/1element/2hd/1length/1node/1,2round/1size/1tl/1trunc/1self/0


Answer 2:

另一个原因是不允许在警卫用户自定义函数是错误的警卫不同的处理方式比在“正常”的功能。 在后卫的错误不会产生异常,它不仅会导致保护本身的失败。

逆天是不是真的表达式,但测试



文章来源: Can I make my own Guards in Erlang?
标签: erlang guard