Erlang:在guard语句中匹配字符串

Dav*_*d S 1 string erlang string-matching

最近开始使用erlang并遇到上面的问题,你如何在一个守卫声明中比较两个字符串?试过字符串:等于(x,y)的方法,但无法让它在一个守卫内部工作.

mpm*_*mpm 8

您可以使用这样的模式匹配:

are_the_same(A, A) ->
  true;
are_the_same(_, _) ->
  false.
Run Code Online (Sandbox Code Playgroud)

在第一个子句中,两个参数都被命名A,这将导致它们相互模式匹配.或者确切地说,第一个参数将A使用=运算符绑定到变量,而第二个参数将A使用=运算符绑定到变量,但由于A已经绑定,因此它将被视为"比较".您可以在docs中阅读更多相关信息.

当然,你可以写一个写第一个clouse使用警卫像:

are_the_same(A, B) when A =:= B ->
Run Code Online (Sandbox Code Playgroud)


leg*_*cia 5

您不需要string:equal/2比较字符串的函数;您可以使用运算符==or =:=,这在防护测试中是允许的。例如:

foo(A, B) when A =:= B ->
    equal;
foo(_, _) ->
    not_equal.
Run Code Online (Sandbox Code Playgroud)

尽管在大多数情况下,您希望改用模式匹配,如其他答案中所述


注意:从 Erlang/OTP 20.0 开始,string:equal(A, B)不再等同于A =:= B. string:equal/2现在运行在字形集群,也有string:equal/3string:equal/4比较时,可以选择忽略的情况下,做的Unicode正常化。因此,在确定比较方法之前,您需要了解“相等”的含义。