2016-06-23 6 views
1

エリクサーの学習に取り組んできました。私は、if/elseを1行だけ行うさまざまな方法について少し興味があります。エリクシルの場合にdo/elseキーワードを使用する理由

私は勝者のいずれかのために適切にどのパイプタプル...

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

...で始まりました。しかし... このは...

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

をしない...と私は|>elseの一部と見なされているからだ、と私は括弧でそれを修正することができますを知っ

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

...これが動作するようになりました。いずれかの勝者の場合、タプルはprint_winnerに正しくパイプされます。

しかし、私は行う/他/エンドブロックインラインを使用して...

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

を行う...としてうまく機能している可能性があります。

私が読んだすべてのリソースは、do:.., else:..形式を使用して説明していますが、do ... else ... endはエラーが発生しにくく、クリーナーに見えます。

私の見ているものを超えて、それらの主な違いは何ですか?

do: ..., else: ...が優先されるようですが、演算子の優先順位にはそれほど敏感ではありませんか?実際に構文

答えて

1

do: else:が好ましいです。あなたがそれを好きなら、それはちょうどそこにあります。それらは同じものに拡張されますが、オペレータの優先順位が異なることがわかりました。それはその左側に最小限の表現を取得しようとするので|>は、貪欲ではありません。

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

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

いくつかのケースでどのようなことがあり
if condition?, do: true_part, else: print_winner(false_part) 

あなたは実際に欲しい。パイプ演算子は、else式の一部になります。 if do endの構文の場合

if condition? do true_part else false_part end |> print_winner 

それは同じです:

print_winner(if condition? do true_part else false_part end) 

スタイルガイドは、リンターはあなたに叫ぶだろうので、常に、「生の値」とのパイプのチェーンを開始することをお勧めします。

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

すばらしい議論、ありがとう!他のものよりも選択肢がぼやけているのですか、それとも一般的に「エリシシティ」として受け入れられ、さまざまな状況で使用されていますか?それにもかかわらず、「...常に価値のあるパイプの連鎖を始める」「...表現をそれ自身の関数にする」というのは、素晴らしいアドバイスです。 – kevlarr

+0

彼らはどちらもエリキシルです。私はdoとelseに '' do:else: 'を使うべきであるというだけの式が1つしかなければ、複数の式がある場合に' 'else else''を残すべきだと主張しています。しかし、個人的には、単一の表現の場合でも、私はちょうど良い見た目をチェックします。 1行の中のすべてが80文字未満の場合、 'do、else:'を使用します。そうでなければ 'do else end'を使います。 Credo linter https://github.com/rrrene/credoをチェックしてください。あなたのコードをチェックします:)これはクールな学習ツールです! – tkowal

2

if condition do 
# something 
else 
# something else 
end 

は、最初のオプションを使用してif condition, do: , else:

を形成するために翻訳され、より読みやすいですし、それはより多くのRubyの構文です。 2番目のオプションを使用すると、不必要なコード行を節約できますが、技術的には全く同じです。 オペレータの優先順位については、ルールは同じです。パイプ演算子について - 常に式の周りにかっこを使います。

+0

」...いつもの表現の周りに括弧を使用します。

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

かは、独自の機能への発現場合取る:最も安全な方法は、役に立たないパイプラインを作る場合は、式の結果を割り当てることであろう"私はそれが好き、良い考え! – kevlarr

関連する問題