Erlang字符串比较不起作用

Hol*_*lly 1 erlang

我只是试图比较两个小时的数据而感到难过.

这基本上就是我写的......

find_client(Search, [Client|Client_list])->
   {Name,Socket} = Client,
   io:fwrite("Name>~s<~n",[Name]),
   io:fwrite("Search>~s<~n",[Search]),
   case string:equal(Name,Search) of
      true->
         do_something;
      false->
         do_something_else
   end;
find_client(Search,[])->
   not_found.
Run Code Online (Sandbox Code Playgroud)

问题是do_something_else总是返回,即使我确信它们应该是平等的!io:fwrite在我的测试中打印出与控制台完全相同的东西,即 -

Name>name1<
Search>name1<
Run Code Online (Sandbox Code Playgroud)

在我尝试使用string之前:相同我试图进行自己的模式匹配,但无论组合我似乎无法让它工作.

我错过了什么吗?我真的很欣赏新鲜的眼睛或者另一种尝试的建议.

YOU*_*LID 8

所有这些都打印相同的东西,因为~s以相同的方式格式化iolists(和atom!).

io:fwrite("~s~n", ["name"]),
io:fwrite("~s~n", [<<"name">>]),
io:fwrite("~s~n", [name]),
io:fwrite("~s~n", [[$n, $a, <<"m">>, "e"]]).
Run Code Online (Sandbox Code Playgroud)

一个更好的"这真的是什么?!" 调试技术将使用~p格式字符串.试试上面的例子吧.

实现string:equal/2=:=操作符实际上没有任何不同(它是模式匹配),因此对于具有不同结构的等效iolists,它不会返回true.

您可能需要做的是编写一个可以比较iolists的比较函数,这可以通过使用来完成iolist_to_binary/1.

iolist_equal(A, B) ->
    iolist_to_binary(A) =:= iolist_to_binary(B).
Run Code Online (Sandbox Code Playgroud)