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
と文字列とバイナリを受け付けるので、しばしば必要はありません。
アイリストは何ですか?
これはバイナリです。または、0から255までの整数を含むリスト。あるいは、これらの2つのもののいずれかを含む任意のネストされたリスト。
文字列やバイナリを連結するときにコピーを避けるために、深く入れ子になった整数とバイナリのリストを使用してIOデータを表現する。
大量のデータを結合する場合でも効率的です。たとえば、バイナリ構文<<B1/binary, B2/binary>>
を使用して2つの50キロバイトのバイナリを結合するには、通常、新しい100kbバイナリに両方を再割り当てする必要があります。 IOリスト[B1, B2]
を使用すると、リスト(この場合は3語[B1, B2]
のみが割り当てられます。リストは要素ごとに1つの単語と別の単語を使用します(詳細はこちらを参照)。
++
演算子を使用すると、新しい2つの要素リストではなく、全く新しいリストが作成されます。要素を最後まで追加するためにリストを再作成すると、リストが長い場合に高価になる可能性があります。
バイナリデータが小さい場合は、バイナリを追加するよりもIOリストを割り当てることができます。バイナリデータが小さいか大きい場合は、IOリストの一貫したコストを受け入れる方がよい場合があります。
追加バイナリは、 ここで説明するように最適化されていることに注意してください 。要するに、バイナリには余分なスペースが割り当てられます。空き領域に収まる別のバイナリが追加された場合、これは満たされます。これは、すべてのバイナリの追加が両方のバイナリの完全なコピーを引き起こすわけではないことを意味します。