2017-05-09 9 views
1

을 통해 함수가 있다고 말합니다. 약간 자세한 정보가 있으며 매번 같은 인수로 호출되는 경우,이 함수는 해당 모듈의 다른 함수가 호출되기 전에 설정을 수행하는 데 많은 시간이 필요합니다. 그 콜백. 엘릭서 통과 함수 매개 변수

SomeMod.called_a_lot(‘xx’, fn(y) -> 
    SomeMod.needs_called_a_lot_to_be_called_first(‘do_stuff’) 
end) 

나는 내가 지금처럼 포장 할 수있는 상상 :

defp easier_to_call(func) do 
    SomeMod.called_a_lot(‘xx’, fn(y) -> func(y) end 
end 

다음과 같이 사용 :

easier_to_call(fn(y) -> 
    SomeMod.needs_called_a_lot_to_be_called_first(‘do_stuff’) 
end) 

이 어떻게 실제로는 비약이 일을합니까?

+1

코드가 정상적으로 보입니다. 익명 함수이기 때문에'func (y)'를'func. (y)'로 변경하십시오. – Dogbert

답변

1

귀하의 구문은 익명 함수를 호출 조금 꺼져 있습니다. 이 익명 함수이기 때문에 당신은

func.(y) 

대신

func(y) 

의 사용해야합니다.

간단한 예는 Elixir Crash Course을 참조하십시오.

1

Dogbert의 의견이 정확합니다. 당신이 인수를 수정하지 않기 때문에, 당신은 단지 익명 함수에 포장하지 않고에 기능을 전달할 수 :

defp easier_to_call(func) do 
    SomeMod.called_a_lot(‘xx’, func) 
end 
1

나는 정확히 당신이 묻는 것을 이해하지 못하지만, capture operator (&)은 당신이 찾고있는 것 같습니다.

예시 이용 될 것이다 : &1 함께

easier_func = &SomeMod.called_a_lot(‘xx’, &1) 

easier_func.(fn(_y) -> 
    SomeMod.needs_called_a_lot_to_be_called_first(‘do_stuff’) 
end) 

익명 함수의 첫 번째 파라미터 인.

당신이 여러 인수에 대응 익명 함수를 필요한 경우 당신은 할 수 있습니다 :이 함수가 처음 호출 할 호출하는 매크로 달성 할 수있는 다음 블록을 호출

easy_reduce = &Enum.reduce(&1, 0, &2) 

easy_reduce.([1,2,3,4], fn(x, acc) -> acc + x end) # => 10 
1

는 그냥 다른 접근 방식을 보여 :

defmodule Test do 
    defmacro with_prepended(arg, do: block) do 
    quote do 
     IO.inspect(unquote(arg), label: "In function") 
     prepended(unquote(arg)) 
     unquote(block) 
    end 
    end 
end 

defmodule Tester do 
    require Test 

    defp prepended(arg), do: IO.inspect(arg, label: "In prepended") 

    def fun(arg) do 
    Test.with_prepended(arg) do 
     IO.puts "Actual code" 
    end 
    end 
end 

Tester.fun(42) 

#⇒ In function: 42 
#⇒ In prepended: 42 
#⇒ Actual code