[Elixir]Enumerable이라는 Protocol

9418 단어 Elixir
Elixir의 소스 코드에 함수를 추가하고 싶어서 코드를 쫓고 있었다면 Enumerable라는 모듈 같은 것이 나왔기 때문에 무엇인가 조사해 보았다.

쫓아 갔을 때 갑자기 나왔다 Enumerabe.slice
2163  def random(enumerable) do
2164    result =
2165      case Enumerable.slice(enumerable) do

수수께끼



Elixir에는 Enum 모듈이 존재하는 이유는 무엇입니까?
처음에는 이것을 몰랐다.
IEx에서이 코드를 시도한 결과
iex(2)> Enumerable.slice([1,2,3])
{:error, Enumerable.List}
iex(3)> Enumerable.slice(%{a: 10, b: 20})
{:ok, 2, #Function<0.84261211/2 in Enumerable.Map.slice/1>}


뭐야 너? ?

결론



결론은 Protocol이었다.

Protocol이라고 하는 것은 ElixirSchool씨에 의하면 이하와 같은 것입니다.

프로토콜은 Elixir에서 폴리모르피즘을 획득하는 수단입니다.

그건 그렇고, Enumerable은 다음과 같은 함수를 가지고 있다고 생각합니다.

  • count(enumerable)
  • Retrieves the number of elements in the enumerable.


  • member?(enumerable, element)
  • Checks if an element exists within the enumerable.


  • reduce(enumerable, acc, fun)
  • Reduces the enumerable into an element.


  • slice(enumerable)
  • Returns a function that slic


  • Function에 구현된 Enumerable.reduce의 이야기



    enum.ex을 보면 대부분 아래쪽에 defimpl 항목이 나오는데 거기에 Function에 대해 구현한 부분이 있군요
    
    3992 defimpl Enumerable, for: Function do
    3993  def count(_function), do: {:error, __MODULE__}
    3994  def member?(_function, _value), do: {:error, __MODULE__}
    3995  def slice(_function), do: {:error, __MODULE__}
    3996
    3997  def reduce(function, acc, fun) when is_function(function, 2), do: function.(acc, fun)
    3998
    3999  def reduce(function, _acc, _fun) do
    4000    raise Protocol.UndefinedError,
    4001      protocol: @protocol,
    4002      value: function,
    4003      description: "only anonymous functions of arity 2 are enumerable"
    4004  end
    4005 end
    

    이게 뭐야
    확실히 count, member?, slice, reduce 함수를 만족하지만 실제로 구현되는 것은 reduce 함수 만..

    덧붙여서 사용해 보면 이런 느낌
    iex(8)> Enumerable.reduce(fn acc, f -> Enum.map(1..10, & f.(&1, acc)) end, [], fn n, acc -> acc ++ [n] end)
    [[1], [2], [3], [4], [5], [6], '\a', '\b', '\t', '\n']
    

    내 상상력으로는 어쩐지 2차원 배열을 좋게 reduce 할 수 있는 것은 라고 생각하거나 합니다만 자세한 것은 잘 모르겠습니다...
    자세한 사용법을 알고 계시다면 알려주세요

    좋은 웹페이지 즐겨찾기