4

以下代码在编译时给了我警告:警告:使用运算符'>'没有效果

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 替换逗号时,没有警告。

4

2 回答 2

7

在这种情况下使用逗号仅分隔两个操作,互不影响: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
于 2012-09-10T07:52:07.543 回答
1

是的,正如@stemm 所说。

在正文中,,只是将动作分开并给它们一个要评估的顺序。编译器告诉你,因为E#a.x > 2没有副作用,永远不会产生异常并且它的返回值被忽略,那么它永远不会影响执行。

但是,在守卫中,将守卫测试,分开,所有这些测试都必须成功才能使守卫成功。

小心地将守卫视为正常的表达方式,它们的行为方式不同,例如这里。守卫在错误上的表现也不同。因此,虽然守卫看起来像表达式,但它们实际上是测试。

于 2012-09-10T09:58:21.227 回答