Erlang Language
アイリストス
サーチ…
前書き
Erlang文字列は整数のリストですが、 "iolist"は要素が整数、バイナリ、または他のアイオリストのリストです(例: ["foo", $b, $a, $r, <<"baz">>]
。そのアイリストは文字列"foobarbaz"
表します。
iolist_to_binary/1
を使ってiolistをバイナリに変換することはできますが、 file:write_file/2
やgen_tcp:send/2
などのErlangライブラリ関数は、 gen_tcp:send/2
と文字列とバイナリを受け付けるので、しばしば必要はありません。
構文
- iolist():: maybe_improper_list(byte()| binary()| iolist()、binary()|)
備考
アイリストは何ですか?
これはバイナリです。または、0から255までの整数を含むリスト。あるいは、これらの2つのもののいずれかを含む任意のネストされたリスト。
文字列やバイナリを連結するときにコピーを避けるために、深く入れ子になった整数とバイナリのリストを使用してIOデータを表現する。
大量のデータを結合する場合でも効率的です。たとえば、バイナリ構文<<B1/binary, B2/binary>>
を使用して2つの50キロバイトのバイナリを結合するには、通常、新しい100kbバイナリに両方を再割り当てする必要があります。 IOリスト[B1, B2]
を使用すると、リスト(この場合は3語[B1, B2]
のみが割り当てられます。リストは要素ごとに1つの単語と別の単語を使用します(詳細はこちらを参照)。
++
演算子を使用すると、新しい2つの要素リストではなく、全く新しいリストが作成されます。要素を最後まで追加するためにリストを再作成すると、リストが長い場合に高価になる可能性があります。
バイナリデータが小さい場合は、バイナリを追加するよりもIOリストを割り当てることができます。バイナリデータが小さいか大きい場合は、IOリストの一貫したコストを受け入れる方がよい場合があります。
追加バイナリは、 ここで説明するように最適化されていることに注意してください 。要するに、バイナリには余分なスペースが割り当てられます。空き領域に収まる別のバイナリが追加された場合、これは満たされます。これは、すべてのバイナリの追加が両方のバイナリの完全なコピーを引き起こすわけではないことを意味します。
IOリストは通常、ファイルやネットワークソケットなどのポートへの出力を構築するために使用されます。
file:write_file("myfile.txt", ["Hi " [<<"there">>], $\n]).
許可されたデータ型をIOリストの前面に追加し、新しいデータ型を作成します。
["Guten Tag " | [<<"Hello">>]].
[<<"Guten Tag ">> | [<<"Hello">>]].
[$G, $u, $t, $e, $n , $T, $a, $g | [<<"Hello">>]].
[71,117,116,101,110,84,97,103,<<"Hello">>].
IOデータをリストの最後に効率的に追加することができます。
Data_1 = [<<"Hello">>].
Data_2 = [Data_1,<<" Guten Tag ">>].
不適切なリストに注意してください
["Guten tag " | <<"Hello">>].
シェルでは、これは["Guten tag "|<<"Hello">>]
代わりに["Guten tag ",<<"Hello">>]
["Guten tag "|<<"Hello">>]
として表示されます。パイプオペレータは、右側の最後の要素がリストでない場合、不適切なリストを作成します。 "tail"がバイナリである不適切なリストは依然として有効なアイリストであるが、多くの再帰関数は空のリストが最後の要素であり、この場合はバイナリではないことを期待しているため、
IOリストのサイズを取得する
Data = ["Guten tag ",<<"Hello">>],
Len = iolist_size(Data),
[<<Len:32>> | Data].
アイリストのサイズは、 iolist_size/1
を使用して計算できます。このスニペットは、メッセージのサイズを計算し、それを4バイトのバイナリとして作成して先頭に追加します。これはメッセージングプロトコルの一般的な操作です。
IOリストはバイナリに変換できます
<<"Guten tag, Hello">> = iolist_to_binary(["Guten tag, ",<<"Hello">>]).
IOリストは、 iolist_to_binary/1
関数を使用してバイナリに変換できます。データが長期間保存されるか、または他のプロセスにメッセージとして送信される場合は、バイナリに変換することが理にかなっています。バイナリに変換するコストは、IOリストを何度もコピーするよりも、単一のプロセスのガベージコレクションやメッセージを他のものに渡すよりも安くなる可能性があります。