1

2ビットのデータを何時間も比較しようとして、私は困惑しました。

これは基本的に私が書いたものです..

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 は iolist (およびアトム!) を同じようにフォーマットするため、これらはすべて同じものを出力します。

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は演算子と何ら変わりはありません=:=(これはパターン マッチです)。そのため、構造が異なる同等の iolist に対して true を返すことはありません。

おそらくあなたがしなければならないことは、iolists を比較できる比較関数を書くことですiolist_to_binary/1

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