2017-10-10 1 views
2

"를"defimpl하는 기능을 전달.내가 다음 코드 한 옵션

# constants.ex 
defmodule Constants do 
    @enumerables [List, Map] 
    def enumerables, do: @enumerables 
end 

# reversible.ex 
import Constants, only: [enumerables: 0] 

defprotocol Reversible do 
    def reverse(term) 
end 

defimpl Reversible, for: enumerables() do 
    def reverse(term), do: Enum.reverse(term) 
end 

그리고 오류가있어 :

== Compilation error in file lib/reversible.ex == 
** (FunctionClauseError) no function clause matching in Module.concat/2 

    The following arguments were given to Module.concat/2: 

     # 1 
     Reversible 

     # 2 
     [List, Map] 

    (elixir) lib/module.ex:562: Module.concat/2 
    lib/reversible.ex:8: (file) 
    (elixir) lib/kernel/parallel_compiler.ex:121: 
     anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/1 

어떻게이 문제를 해결하기를

그래서 나는이 작업을 수행하려고?

답변

3

defimplfor 인수 at compile time (매크로 인수) and if it's a list, it recurses over all items of the list의 값을 확인합니다. 변수가 리터럴 목록이 아니기 때문에 defimpl은 목록으로 취급하지 않습니다.

당신은 목록을 반복하고에 defimpl를 호출하여이 문제를 해결할 수 있습니다 각각 자신 :

# constants.ex 
defmodule Constants do 
    @enumerables [List, Map] 
    def enumerables, do: @enumerables 
end 

# reversible.ex 
defprotocol Reversible do 
    def reverse(term) 
end 

for enumerable <- Constants.enumerables do 
    defimpl Reversible, for: enumerable do 
    def reverse(term), do: Enum.reverse(term) 
    end 
end 

테스트 :

$ iex -S mix 
iex(1)> Reversible.reverse [1, 2, 3] 
[3, 2, 1] 
iex(2)> Reversible.reverse %{1 => 2, 3 => 4} 
[{3, 4}, {1, 2}] 
+0

나는 솔루션에서 다시 구현'defimpl'을 포함 할 것이다 생각 어떤 식 으로든 인용문/인용 부호를 어지럽히는 경우. 귀하의 솔루션은 간단하고 깨끗합니다, 감사합니다! –