2017-10-03 17 views
0

名前付き関数の代わりにElixirで匿名関数を使用する場合私は無名関数を使用する。この場合エリクサーで匿名関数を使用する場合

handle_open = fn 
{:ok, :done} -> "OK" 
{:error, _} -> "Error:" 
end 
handle_open.(ExAws.S3.download_file("#{Application.get_env(:ex_aws, :s3)[:bucket_s3]}", "foo.jpg", "../../public") |> ExAws.request); 

は、例えば、私は、このスニペットを持っています。名前付き関数を使って同じ結果を(マルチボディで)どのようにすることができますか?

この場合、匿名または名前付き関数を使用する方が正しいですか?

あなたがそうのように、ケース句、または2つの機能句を持つ単一機能を行うだろうどちらか
+1

匿名関数または名前付き関数を使用するときの答えは、新しい関数に少しのコードを抽出するときと同じです。なぜあなたは抽出するのですか?あなたはそれを再利用したいからです。あなたのコードが小さい場合は、無名関数を定義して使用してください(主に 'Enum.map'のようなコールバックを受け取る関数で使用されます)。他の場所で関数が必要な場合は、それを名前付き関数に抽出する方が良いでしょう。補足として、変数に無名関数を割り当てました。それは私がめったに見ることのないものです。一度使用するコードにはインラインの匿名関数を使用し、再利用可能なものには名前付きのものを使用します。 – vfsoraki

答えて

2

:パラメータとして通常

def handle_open({:ok, :done}), do: "OK" 
def handle_open({:error, _}), do: "Error:" 
+0

ありがとう、どうすればいいですか?私はあなたのコメントのような2つのプライベート関数を作成し、この 'ExAws.S3.download_file("#exeaws、:s3)[:bucket_s3]} "、" foo.jpg "、" ../../public ")|> ExAws.request' – monkeyUser

+0

私はこのように関数を書いています。https://pastebin.com/vYH2kzh1 – monkeyUser

1

Elixirの多くの標準ライブラリ関数は、関数をパラメータとして受け入れます。例えば

Enum.map

[1, 2, 3] 
|> Enum.map(fn(number) -> 
    number * 2 
end) 

あなたはまた、機能

def multiple_by_two(number), do: number * 2 

命名し、それをキャプチャ定義することができます。

Enum.map([1, 2, 3], &multiple_by_two/1) 

が、第一の方法はまた、非常に使用されていますしばしば。

+0

ありがとうdenisですが、名前の代わりにanonを使用する必要があるとき? – monkeyUser

+1

あなたは 'する必要がある'のようなケースを知りません。彼らは交換可能であるように見えます。 –