Erlang Language
아이올리스트
수색…
소개
Erlang 문자열은 정수 목록이지만 "iolist"는 정수, 바이너리 또는 다른 iolists (예 : ["foo", $b, $a, $r, <<"baz">>]
. 그 아이올리스트는 문자열 "foobarbaz"
나타냅니다.
iolist_to_binary/1
을 사용하여 iolist를 바이너리로 변환 할 수는 있지만 file:write_file/2
및 gen_tcp:send/2
와 같은 Erlang 라이브러리 함수는 문자열과 바이너리는 물론 iolists도 허용합니다.
통사론
- - 타입 iolist () :: maybe_improper_list (바이트 () | 바이너리 () | iolist (), 바이너리 () | []).
비고
아이올리스트 란 무엇입니까?
어떤 바이너리 이건. 또는 0에서 255 사이의 정수를 포함하는 목록. 또는 두 가지 중 하나를 포함하는 임의의 중첩 목록.
문자열이나 바이너리를 연결할 때 복사하지 않도록 IO 데이터를 나타 내기 위해 깊게 중첩 된 정수 및 바이너리 목록을 사용하십시오.
많은 양의 데이터를 결합 할 때도 효율적입니다. 예를 들어 바이너리 구문 <<B1/binary, B2/binary>>
사용하여 2 개의 50 킬로바이트 바이너리를 결합하는 것은 일반적으로 새로운 100kb 바이너리로 두 가지를 재 할당해야합니다. IO 목록 사용 [B1, B2]
는 목록 (이 경우 세 단어) 만 할당합니다. 목록은 요소 당 하나의 단어와 다른 단어를 사용합니다. 자세한 내용은 여기 를 참조하십시오.
++
연산자를 사용하면 새로운 두 요소 목록 대신 완전히 새로운 목록을 만들 수 있습니다. 목록을 다시 작성하여 끝에 요소를 추가하면 목록이 길면 비용이 많이들 수 있습니다.
바이너리 데이터가 작은 경우 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">>]
. 파이프 연산자는 오른쪽의 마지막 요소가 목록이 아닌 경우 부적절한 목록을 만듭니다. "꼬리"가 바이너리 인 부적절한 목록은 여전히 유효한 iolist이지만 부적절한 목록은 문제를 야기 할 수 있습니다. 많은 재귀 함수는 빈 목록이 마지막 요소가 될 것으로 예상하고이 경우에는 바이너리가 아니기 때문입니다.
IO 목록 크기 가져 오기
Data = ["Guten tag ",<<"Hello">>],
Len = iolist_size(Data),
[<<Len:32>> | Data].
iolist의 크기는 iolist_size/1
사용하여 계산할 수 있습니다. 이 스 니펫은 메시지의 크기를 계산하고이를 4 바이트 바이너리로 생성하여 앞에 추가합니다. 이것은 메시징 프로토콜의 일반적인 작업입니다.
IO 목록은 바이너리로 변환 될 수 있습니다.
<<"Guten tag, Hello">> = iolist_to_binary(["Guten tag, ",<<"Hello">>]).
IO 목록은 iolist_to_binary/1
함수를 사용하여 2 진수로 변환 할 수 있습니다. 데이터가 장기간 저장되거나 다른 프로세스에 메시지로 보내지는 경우 데이터를 이진으로 변환하는 것이 좋습니다. 하나의 바이너리로 전환하는 데 드는 비용은 IO 목록을 여러 번 복사하는 것, 단일 프로세스의 가비지 수집 또는 다른 사람들에게 전달되는 메시지에서보다 저렴할 수 있습니다.