我只是想把两位数据进行数小时比较而感到难过。
这基本上就是我写的......
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之前:相同我试图进行自己的模式匹配,但无论组合我似乎无法让它工作。
我错过了什么吗?我真的很感激新鲜的眼睛,或者建议采用另一种方式尝试。
答案 0 :(得分: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"]]).
更好“这真的是什么?!”调试技术将使用~p格式字符串。试试上面的例子吧。
string:equal/2
的实现与=:=
运算符(它是模式匹配)没有任何不同,因此对于具有不同结构的等效iolists,它不会返回true。
您可能需要做的是编写一个可以比较iolists的比较函数,这可以通过iolist_to_binary/1
轻松完成。
iolist_equal(A, B) ->
iolist_to_binary(A) =:= iolist_to_binary(B).