我目前正在学习 Erlang,它的模式匹配是我最近看到的最酷的东西之一。我在练习中想出的一个小玩具功能如下:
b_and(true, true) ->
true;
b_and(true, false) ->
false;
b_and(false, true) ->
false;
b_and(false, false) ->
false;
b_and(_, _) ->
{error, invalid_object}.
不过,我想知道是否有语法告诉模式中的变量只接受一组枚举的原子?这样,我可以将其缩短为这样的内容:
b_and(true, true) ->
true;
% We've already satisfied the only true case
b_and(ENUM(true, false), ENUM(true, false)) ->
false;
b_and(_, _) ->
{error, invalid_object}.
我查看了有关模式匹配的文档,但找不到类似的内容。
最佳答案
目前没有直接的方法将原子列表指定为模式。
在你的情况下,你可以使用守卫,但它几乎不短
b_and(true, true) -> true;
b_and(A, B) when A =:= true or A =:= false,
B =:= true or B =:= false ->
false.
顺便说一句,当用其他任何东西调用该函数都会出错时,人们通常会不使用错误子句。
您可以使用此解析转换 https://github.com/mad-cocktail/gin这会给你一个守卫的 in() 形式。问题是它是否值得,只是对于这样一个很少且不经常使用的功能,具有解析转换似乎有点重量级。
关于erlang - 在 Erlang 中,有没有办法对一组枚举的原子进行模式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17770852/