次のコードは、コンパイル時に警告を表示します。警告:演算子'>'を使用しても効果はありません
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に置き換えても、警告はありません。
この場合にコンマを使用すると、2つのアクションのみが分離され、相互に影響はありません。E#a.x > 1
次の操作(関数の結果)E#a.y =:= 2
これは、あなたの場合、フィルター関数が次のようになることを意味します。
fun( E ) ->
E#a.y =:= 2
end
ガード式を記述している場合のみ、コンマの使用法はの使用法と同じです。それ以外の場合、コンマはアクション間の区切り文字andalso
にすぎません。
したがって、次の2つの方法で関数を書き直すことができます。
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
、副作用がないため、例外を生成せず、その戻り値が無視され、実行に影響を与えないことを通知しています。
ただし、ガードでは、ガードが成功するためにすべてが成功する必要があるガードテスト,
を分離します。
たとえば、ここでのように、ガードを通常の表現として表示する場合は、ガードの動作が異なることに注意してください。ガードは、エラーに対しても異なる動作をします。したがって、警備員は表現のように見えますが、実際にはテストです。