以下代码在编译时给了我警告:警告:使用运算符'>'没有效果
rd(a,{x,y}),
List = [#a{x=1,y=2}, #a{x=3,y=4}],
lists:filter(
fun(E) ->
E#a.x > 1, E#a.y =:= 2
end, List).
但是当我用 andalso 替换逗号时,没有警告。
以下代码在编译时给了我警告:警告:使用运算符'>'没有效果
rd(a,{x,y}),
List = [#a{x=1,y=2}, #a{x=3,y=4}],
lists:filter(
fun(E) ->
E#a.x > 1, E#a.y =:= 2
end, List).
但是当我用 andalso 替换逗号时,没有警告。
在这种情况下使用逗号仅分隔两个操作,互不影响:E#a.x > 1
和下一个操作(这是函数的结果)E#a.y =:= 2
这意味着在您的情况下,过滤器功能等于:
fun( E ) ->
E#a.y =:= 2
end
仅当您编写保护表达式时,逗号的用法等于 的用法andalso
,否则 - 逗号只是操作之间的分隔符。
因此,您可以通过两种方式重写您的函数:
1)
fun
(E) when E#a.x > 1, E#a.y =:= 2 ->
true;
(_Othervise) ->
false
end
2)
fun( E ) ->
(E#a.x > 1) andalso (E#a.y =:= 2)
end
是的,正如@stemm 所说。
在正文中,
,只是将动作分开并给它们一个要评估的顺序。编译器告诉你,因为E#a.x > 2
没有副作用,永远不会产生异常并且它的返回值被忽略,那么它永远不会影响执行。
但是,在守卫中,将守卫测试,
分开,所有这些测试都必须成功才能使守卫成功。
小心地将守卫视为正常的表达方式,它们的行为方式不同,例如这里。守卫在错误上的表现也不同。因此,虽然守卫看起来像表达式,但它们实际上是测试。