1

几个小时以来,我一直试图比较两位数据,这让我很困惑。

这基本上是我写的..

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.

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

Name>name1<
Search>name1<

在我尝试 string:equal 之前,我试图进行自己的模式匹配,但无论组合如何,我似乎都无法让它发挥作用。

我错过了什么吗?我真的很感激你有一双新鲜的眼睛或对另一种尝试方式的建议。

4

1 回答 1

8

所有这些都打印相同的内容,因为 ~s 以相同的方式格式化 iolists(和原子!)。

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

更好的“这到底是什么?!” 调试技术将使用 ~p 格式字符串。试试上面的例子。

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

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

iolist_equal(A, B) ->
    iolist_to_binary(A) =:= iolist_to_binary(B).
于 2013-05-01T20:26:51.023 回答