수색…


소개

Erlang 문자열은 정수 목록이지만 "iolist"는 정수, 바이너리 또는 다른 iolists (예 : ["foo", $b, $a, $r, <<"baz">>] . 그 아이올리스트는 문자열 "foobarbaz" 나타냅니다.

iolist_to_binary/1 을 사용하여 iolist를 바이너리로 변환 할 수는 있지만 file:write_file/2gen_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 목록을 여러 번 복사하는 것, 단일 프로세스의 가비지 수집 또는 다른 사람들에게 전달되는 메시지에서보다 저렴할 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow