responseのbinary情報に対して、特定の日本語が含まれているかという判定式を記述していたところで、この現象に遭遇した。"いちご")false間違いなくbinaryの中には第2引数で渡している日本語ひらがな(内部データ的にはこいつもbinary)が含まれているのになぜかfalseになる。"あいう")falseString.contains?の実装を見てみるまずは公式ドキュメントから。pattern.文字列に与えられたコンテンツが含まれているかどうかを確認。コンテンツは文字列、文字列リスト、もしくはコンパイルされたパターンのどれか。コードサンプルも確認しておこう。"death"])trueなにやら見慣れない使い方を発見。Erlang.このモジュールには、バイト指向のバイナリを操作するための関数が含まれています。純粋なErlangで記述された関数よりも高速に実行される、もしくはメモリの消費量が少なくなります。思った通り、バイナリ操作をするための関数群らしい。先ほど、登場した:binary.compile_patternについて確認する。少々長いので、部分的に公式ドキュメントを引用する。matches/3などの関数で使用するための検索パターンをバイナリから作成するための関数のよう。リストの場合も同様で、引数で渡すときはflatなデータを代入してくれなど諸注意についても記述されている。patternというものも試してみたがtrueに判定されなかった。patternについての知識が乏しいというのもあるが、一旦考えないこととする。:nomatchendまずcontains?に関してはパターンマッチを使用して3種類の関数が実装されている。共通の条件としては第1引数がバイナリであること。matching、trueを返すようなのでor条件式。それに加えた以下の条件によって3つの関数を使い分けしているようだ1.第2引数が空のリストの場合に固定でfalseを返す2.第2引数がリストであり、要素を持っている。:nomatchではないここで、再びErlangのドキュメントの:binary.matchに戻る。erlang:nif_error(undef).え、どういうこと。単純にErlangのsyntaxを理解出来ていないのか。part()もしくはnomatch(atom)を返すのは分かるけど、判定をどこでしてるのかが全く分からない。判定をどうやっているかが分からないと今回一番見たい部分を見る事が出来ない。part()に当たるものだろう。part().気を取り直して、binaryのドキュメントをよく見てると判定をどのようにしているかの旨が記述されているではないか。integer()}は上記のように構成されており、Start()はbinary()という基準点からの距離?(offset...うーん、いまいち何を言ってるのか分からないが)を持つらしい。こんな時は頭を空っぽにして、コードの実行結果を見てみよう。10>>あーなるほど、offsetと言っているのはsliceを行うというような意味合いなのか。すると内部でやっていることは大したことではないはず。listに変換するbinary.bin_tolistを試してみたところ、とんでもないことが分かった。134>>"あいう"素晴らしい。"あいう")trueなるほど、やはりそうだった。内部でcallしているのがErlangのモジュールに実装された関数であるため、byte情報の取り扱い方が異なるのが原因だと考えられる。Erlangでは日本語ひらがな1文字は3byteの情報で扱うのだが、Elixirでは1byteの情報として扱っている。この違いのせいで、思ったようにtrueの判定にならなかったのだろう残る疑念Elixirではbinary情報を1byteで扱っている、Erlangでは日本語ひらがなに関しては3byteで扱っていると記述しているが、これは本当にbyteなのか。単位が正確ではない気がする。週間)「俺また、やっちゃいました?(致命的バグ)」なろう系23歳の非異世界転生なWeb系Developer。Elixirという言語を推し中。清流elixir運営してます。紅茶の勉強を始めたり、チャリを買おうとして買わなかったりと興味が分散しがち。今は、並行コンピューティングに強めの興味があります。(2)月別アーカイブ広告はてなブログをはじめよう!takamizawa46さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。