2017-10-03 1 views
0

Wann anonyme Funktionen in Elixir anstelle von benannten Funktionen zu verwenden?Wann sollen anonyme Funktionen in Elixir verwendet werden?

Zum Beispiel habe ich diese Schnipsel:

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); 

In diesem Fall habe ich eine anonyme Funktion verwenden. Wie kann ich mit einer benannten Funktion das gleiche Ergebnis (mit Mehrkörper) erhalten?

In diesem Fall ist es richtiger, eine anonyme oder benannte Funktion zu verwenden?

+1

Die Antwort auf die Verwendung von anonymen oder benannten Funktionen ist dieselbe, wenn Sie ein wenig Code in eine neue Funktion extrahieren. Warum extrahierst du? Weil Sie es wiederverwenden wollen. Wenn Ihr Code eher klein ist, definieren Sie einfach eine anonyme Funktion und verwenden Sie sie (meistens bei Funktionen, die einen Callback erhalten, z. B. "Enum.map"). Wenn Sie Ihre Funktion woanders brauchen, ist es besser, sie in eine benannte Funktion zu extrahieren. Als Randnotiz haben Sie Ihre anonyme Funktion einer Variablen zugewiesen. Das sehe ich selten. Verwenden Sie anonyme Inline-Funktionen für Einmalcodes und benannte für wiederverwendbare Codes. – vfsoraki

Antwort

2

würden Sie entweder tun, um eine einzelne Funktion mit einem Fall-Klausel oder zwei Funktionsklauseln, etwa so:

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

danke, und wie kann ich es dann anrufen? Ich erstelle zwei private Funktionen wie deinen Kommentar, und wie kann ich ein Muster mit dieser 'ExAws.S3.download_datei (" # {Application.get_env (: ex_aws,: s3) [: bucket_s3]} "," foo.jpg "," ../../public ") |> ExAws.request' – monkeyUser

+0

Ich schreibe die Funktion auf diese Weise, https://pastebin.com/vYH2kzh1 – monkeyUser

1

Regel als Parameter.

Viele Standardbibliotheksfunktionen in Elixir akzeptieren eine Funktion als Parameter.

Zum Beispiel Enum.map:

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

Sie auch

Funktion mit dem Namen definieren könnte
def multiple_by_two(number), do: number * 2 

Und dann fangen:

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

aber die erste Art und Weise auch sehr verwendet wird häufig.

+0

danke denis, aber wenn ich anon statt named verwenden muss ? – monkeyUser

+1

Ich kenne solche Fälle nicht, wenn Sie "müssen". Es sieht so aus, als wären sie austauschbar. –

Verwandte Themen