development

엘릭서에서 문자열을 결합하는 방법?

big-blog 2020. 6. 29. 07:30
반응형

엘릭서에서 문자열을 결합하는 방법?


공백이있는 목록에서 두 문자열을 어떻게 결합합니까?

["StringA", "StringB"]

된다

"StringA StringB"

임의의 목록에 가입하려는 경우 :

"StringA" <> " " <> "StringB"

또는 문자열 보간을 사용하십시오.

 "#{a} #{b}"

목록 크기가 임의 인 경우 :

Enum.join(["StringA", "StringB"], " ")

... 위의 모든 솔루션이 반환됩니다

"StringA StringB"

가지고있는 것이 임의의 목록이라면을 사용할 수 Enum.join있지만 2 ~ 3 인 경우 명시 적 문자열 연결을 쉽게 읽을 수 있어야합니다

"StringA" <> " " <> "StringB"

그러나 네트워크 등을 통해 출력하려는 ​​경우 메모리에서 단일 문자열로 가질 필요가없는 경우가 종종 있습니다. 이 경우, 데이터 복사에서 절약되는 iolist (특정 유형의 딥 목록)를 사용하는 것이 유리할 수 있습니다. 예를 들어

iex(1)> IO.puts(["StringA", " ", "StringB"])
StringA StringB
:ok

딥 목록을 사용하면 해당 문자열을 변수로 사용할 수 있으므로 다른 곳에서 출력하기 위해 완전히 새로운 문자열을 할당하지 않아도됩니다. elixir / erlang의 많은 함수는 iolist를 이해하므로 추가 작업을 수행 할 필요가없는 경우가 많습니다.


완성도에 대한 응답으로 문자열 보간 을 사용할 수도 있습니다 .

iex(1)> [a, b] = ["StringA", "StringB"]
iex(2)> "#{a} #{b}"
"StringA StringB"

Enum.reduce도 귀하의 예에 맞지 않습니까?

iex(4)> Enum.reduce(["StringA", "StringB"], fn(x, acc) -> x <> " " <> acc end) "StringB StringA"


목록에 공백을 추가해도 괜찮다면이를 iolist로 취급 할 수 있습니다.

["StringA", " ", "StringB"] |> IO.iodata_to_binary # "StringA StringB"

메모리의 문자열을 복제하지 않으므로 성능이 향상됩니다.


당신이하려는 일에 달려 있습니다. 새 변수에 쓰려고하면 다음 중 하나를 사용하십시오.

  • 문자열 보간

    a = "StringA"
    b = "StringB"
    "#{a} #{b}"
    
  • 문자열 연결 : "StringA" <> " " <> "StringB

  • Enum.join(): ["StringA", "StringB"] |> Enum.join(" ")

그러나 Uri가 언급했듯이 IOList를 사용할 수도 있습니다.

["StringA", " ", "StringB"] |> IO.iodata_to_binary

리소스 소비에 관심이있는 경우 실제로 IOList가 가장 성능이 우수합니다. Big Nerd Ranch는 IOList를 통한 성능 향상에 대해 잘 작성 했습니다.


당신은 또한 할 수 있습니다 'string A' ++ ' ' ++ 'string B'


IO 목록 사용을 고려하십시오. [ "String1", "string2"]가 있고 iolist_to_binary / 1을 사용하면 해당 문자열을 새 문자열로 복사합니다. IO 목록이있는 경우 대부분의 경우 출력 할 수 있으며 포트에 연결됩니다. 그리고 이것이 핵심입니다. 런타임은 데이터 복사본을 만들 필요가 없으므로 연결보다 훨씬 효율적입니다.

참고 URL : https://stackoverflow.com/questions/20829348/how-to-join-strings-in-elixir

반응형