2017-05-09 1 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 実際はエリクサーでこれを行うのですか?

+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 
関連する問題