[Elixirv1.12] tap/2, then/2 편해요.

7685 단어 Elixirtech
Elixir의 v112월 19일 발매된 지 한 달 정도 지났다.v1.12 새로 Kernel.then/2, Kernel.tap/2의 함수를 추가했다.여기는 간단하고 편리하니 내가 설명해 줄게.
https://elixir-lang.org/blog/2021/05/19/elixir-v1-12-0-released/

then/2

then/2 첫 번째 파라미터의 값을 두 번째 파라미터의 함수에 전달하고 결과를 되돌려줍니다.
  iex> 1 |> then(fn x -> x * 2 end)
  2
pipe를 연결하는 과정에서 매개 변수의 순서를 바꾸려는 경우 유용하다.
  iex> "some text" |> then(&File.write!("out.txt", &1))
  :ok
지금까지then/2가 없었다면 아래와 같이 써야 한다.Then을 사용하면 더욱 산뜻합니다.
  iex> "some text" |> (&File.write!("out.txt", &1)).()
  :ok

tap/2

tap/2then/2와 마찬가지로 첫 번째 파라미터의 값을 두 번째 파라미터가 지정한 함수에 건네주고 실행하지만 첫 번째 파라미터에 건네준 값 자체로 되돌아간다.
  iex> tap(1, fn x -> x + 1 end)
  1
pipe 사이에 로그 출력 등을 끼워 넣으면 pipe에서 출력을 바꾸지 않고 다른 처리를 할 때 편리합니다.
some_func()
|> tap(&Logger.info/1)
|> other_func()
IO.inspect처럼'pipe의 흐름 자체가 바뀌고 싶지 않지만 끼워 처리하고 싶다'는 상황tap/2이 나타나면 좋겠다.

코드 예


공식 블로그의 코드 블록은 식별하기 쉬워서 여기에도 두었다.tap/2,then/2사용하면 더욱 원활합니다.
tap/2, then/2 사용 시
"hello world"
|> tap(&IO.puts/1)
|> then(&Regex.scan(~r/\w+/, &1))
tap/2,then/2를 사용하지 않는 경우
"hello world"
|> (fn x ->
      IO.puts(x)
      x
    end).()
|> (&Regex.scan(~r/\w+/, &1)).()

총결산


Elixir v1.12에서 도입된Kernel.then/2,Kernel.tap/2를 소개했다.공식 블로그의 기술 중
  • tap/2와then/2는 모두 매크로로 실현
  • Erlang/OP24에서 컴파일러의 개선을 통해 중간의 무명 함수를 최적화
  • 따라서 then과tap을 이용하여 무명 함수를 연결하는 것도 성능에 문제가 없다.꼭 활용하세요.

    참고 자료


    https://elixir-lang.org/blog/2021/05/19/elixir-v1-12-0-released/
    https://medium.com/blackode/two-new-life-saving-functions-worth-knowing-elixir-1-12-tap-then-b0120fcfb93f

    좋은 웹페이지 즐겨찾기