2016-06-23 5 views
1

Sie haben gerade daran gearbeitet, Elixir zu lernen, und ich bin ein wenig neugierig auf die verschiedenen Möglichkeiten, eine I/I-Linie zu erstellen.Warum verwenden Sie/else Schlüsselwörter zu wenn in Elixir?

Ich begann mit ...

if left_side_wins?(p, c) do 
    {"Humanity", p, c} 
else 
    {"The Machine", c, p} 
end 
|> print_winner 

... die Rohre das Tupel richtig entweder für Gewinner. Aber diese nicht ...

if left_side_wins?(p, c), do: {"Humanity", p, c}, else: {"The Machine", c, p} 
|> print_winner 

... und ich weiß, es ist, weil die |> Teil der else betrachtet wird, und ich kann es mit Klammern befestigen ...

if(left_side_wins?(p, c), do: {"Humanity", p, c}, else: {"The Machine", c, p}) 
|> print_winner 

... und das funktioniert jetzt. Für jeden Gewinner wird das Tupel korrekt an print_winner geleitet.

Aber ich konnte auch ein Inline verwenden tun/else/Endblock und tun ...

if left_side_wins?(p, c) do {"Humanity", p, c} else {"The Machine", c, p} end 
|> print_winner 

... die auch funktioniert.

Jede Ressource, die ich gelesen habe, beschreibt mit dem do:.., else:.. Format, aber die do ... else ... end scheint sowohl sauberer und weniger fehleranfällig.

Was sind die Hauptunterschiede zwischen ihnen, jenseits dessen, was ich sehe?

Die do: ..., else: ... scheint bevorzugt zu sein, aber ist es nicht empfindlicher für die Vorrangstellung des Operators?

Antwort

1

Es ist nicht so, dass do: else: bevorzugt ist. Es ist nur da, wenn es dir gefällt. Sie erweitern sich zu der gleichen Sache, aber wie Sie festgestellt haben, ist der Operator Vorrang. |> ist nicht gierig, so versucht es minimal Ausdruck auf seinem linken zu erhalten:

if condition?, do: true_part, else: false_part |> print_winner 

das ist:

if condition?, do: true_part, else: (false_part |> print_winner) 

das ist:

if condition?, do: true_part, else: print_winner(false_part) 

in einigen Fällen das, was sein kann, du willst wirklich. Der Pipe-Operator wird Teil des Else-Ausdrucks. Im Falle von if do end Syntax.

if condition? do true_part else false_part end |> print_winner 

es ist das gleiche wie:

print_winner(if condition? do true_part else false_part end) 

Die Styleguides raten immer Kette von Rohren mit „Rohwert“ zu beginnen, so Linters dich schreien würde. Der sicherste Weg wäre Ergebnis, wenn Ausdruck zuweisen, die die Pipeline unbrauchbar macht:

winner = if left_side_wins?(p, c), do: {"Humanity", p, c}, else: {"The Machine", c, p} 
print_winner(winner) 

oder das nehmen, wenn Ausdruck in seine eigene Funktion:

def determine_winner({p, c}) do 
    if left_side_wins?(p, c), do: {"Humanity", p, c}, else: {"The Machine", c, p} 
end 

{p, c} 
|> determine_winner 
|> print_winner 
+0

Große Diskussion, danke! Sind irgendwelche der Entscheidungen mehr verpönt als andere, oder werden sie im Allgemeinen alle als "Elixier" akzeptiert und in verschiedenen Situationen verwendet? Unabhängig davon, die "... immer Kette von Rohren mit Rohwert beginnen .." und "... wenn Ausdruck in seine eigene Funktion" sind ** große ** Ratschläge. – kevlarr

+0

Sie sind beide Elixirisch. Ich sehe Leute argumentieren, dass, wenn es nur einen Ausdruck in do und sonst gibt, als es '' tun sollte: else: 'und zu verlassen" do else end "für Fälle, in denen es mehrere Ausdrücke gibt. Aber selbst bei einzelnen Ausdrücken überprüfe ich einfach, was schöner aussieht. Wenn alles in einer Zeile weniger als 80 Zeichen hat, verwende ich ', do: else:' sonst 'do else end '. Check out Credo linter https://github.com/rrrene/credo Es überprüft deinen Code für solche Dinge :) Es ist cooles Lernwerkzeug! – tkowal

2

Tatsächlich ist die Syntax:

if condition do 
# something 
else 
# something else 
end 

übersetzt if condition, do: , else:

Mit erster Option zu bilden besser lesbar ist, und es ist mehr Rubys Syntax. Mit der zweiten Option können Sie einige unnötige Zeilen Code sparen, aber technisch ist das gleiche. Über den Operator Vorrang-Regeln sind die gleichen. Und über Pipe Operator - immer Klammern um Ausdrücke verwenden.

+0

“... immer mit Klammern um Ausdrücke "Ich mag das, guter Gedanke! – kevlarr

Verwandte Themen