Elixir의 List.to_string 이해하기
Source: Dev.to
list = [1, 2, 3]
IO.puts "list is ", list
위 코드는 작동하지 않습니다 – IO.puts/2는 두 번째 인자로 바이너리(문자열)를 기대합니다.
IO.inspect list와 같은 다른 변형을 시도해도 리스트 자체만 출력됩니다.
List.to_string/1이 기대와 다른 이유
Elixir에는 List.to_string/1이라는 함수가 있지만, 리스트를 프린터블한 문자열 표현으로 변환하지 않습니다. 대신 리스트를 유니코드 코드 포인트들의 집합으로 간주하고, 그 코드 포인트들로부터 UTF‑8 바이너리를 생성합니다.
iex> [232, 137, 178] |> List.to_string()
>
iex> [1, 2, 3] |> List.to_string()
>
결과는 비트스트링(바이너리)이며, 주어진 코드 포인트들의 UTF‑8 인코딩을 나타냅니다. 바이너리에 출력할 수 없는 문자가 포함되어 있으면 IEx는 > 구문으로 표시합니다.
결과 확인하기
iex> [232, 137, 178] |> List.to_string() |> i
Term
>
Data type
BitString
Byte size
6
Description
This is a string: a UTF‑8 encoded binary. It's printed with the `>`
syntax because it contains non‑printable UTF‑8 encoded code points.
Implemented protocols
Collectable, IEx.Info, Inspect, JSON.Encoder, List.Chars, String.Chars
비트스트링(또는 바이너리)은 단순히 바이트들의 연속일 뿐입니다. 여기서는 원본 리스트의 텍스트 표현이 아니라 UTF‑8 인코딩된 문자열입니다.
List.to_string/1이 실제로 하는 일
이 함수는 리스트를 평탄화하고, 각 요소를 유니코드 코드 포인트로 해석하여 바이너리를 만듭니다:
iex> ["o","m",["z","y"]] |> List.to_string()
"omzy"
그 바이너리를 출력하면 연결된 문자들이 보입니다:
iex> ["o","m",["z","y"]] |> List.to_string() |> IO.puts()
omzy
:ok
리스트의 텍스트 표현에 해당하는 ASCII 코드들의 리스트를 넣으면, 그 표현을 다시 얻을 수 있습니다:
iex> [91, 50, 51, 50, 44, 32, 49, 51, 55, 44, 32, 49, 55, 56, 93]
|> List.to_string()
|> IO.puts()
[232, 137, 178]
:ok
리스트를 올바르게 출력하는 방법
리스트를 사람에게 읽기 쉬운 형태( IO.inspect/1에서 보는 것과 유사)로 출력하고 싶다면 inspect/1을 사용합니다:
iex> [232, 137, 178] |> inspect() |> IO.puts()
[232, 137, 178]
:ok
iex> ["o","m",["z","y"]] |> inspect() |> IO.puts()
["o", "m", ["z", "y"]]
:ok
inspect/1은 리스트를 Elixir 소스 코드에 나타나는 그대로 보여주는 문자열을 반환합니다.
요약
List.to_string/1은 정수(코드 포인트) 리스트를 UTF‑8 바이너리로 변환하며, 리스트 자체의 텍스트 표현으로 변환하지 않습니다.- 결과 바이너리는 비트스트링이며, 출력할 수 없는 문자가 포함될 경우
>로 표시될 수 있습니다. - 리스트의 프린터블한 표현을 얻고 싶다면
inspect/1(또는 간단히IO.inspect/1)을 사용하세요.