CoffeeScriptでの3項演算


318

a条件に応じて値を設定する必要があります。

CoffeeScriptでこれを行う最も簡単な方法は何ですか?

たとえば、これは私がJavaScriptでそれを行う方法です:

a = true  ? 5 : 10  # => a = 5
a = false ? 5 : 10  # => a = 10

120
<rant>コーヒースクリプトが3項演算子の構文をサポートしていればいいのに、それよりも短くて読みやすいですif else then </ rant>
AJP

2
@AJP Rubyにそれがあったとしても、三元系はコーヒーのRubyっぽさを少なくすると思います。コーヒーの目標は、常に読みやすさと粗い角を丸めることです。
jcollum 2013年

37
@jcollumは同意しましたが、実際に最も不安を感じているのa = true ? 5 : 10は、有効なコーヒースクリプトですが、3値構造を意味するのではなく、代わりに(JavaScriptで)意味します。a = true ? true : {5:10}これは悪いこととして知られていa = false ? {5 : 10}ます。同等:a = true ? false : {5:10} それだけの価値があるので、私はそれが良いとは思いません。
AJP

2
CoffeeScriptのif..then..elseを詳しく説明することをお勧めします。?存在演算子は非常に理にかなっているので、beast = yeti ? "bear"またはかなりうまくif yeti? then alert "It's a yeti!"利用でき?ます。
ポールオリバー

3
CoffeeScriptでは、別の3項演算子はif/then/else既に式であり、同じことをするので、実際には必要ありません。あなたが本当にそれを欠いているなら、あなたは本当にそれを必要とするよりもむしろCやJavaScript構文に慣れています。それが十分に読めない場合、そしてそれが時々起こる場合は、式全体を括弧で囲んでください。オペレーター?は、@ PaulOliverですでに述べられているように、JavaScriptにはない、より便利なチェックのために使われていません。実在演算子が一番です。
スケーリー2014年

回答:


544

すべてが式であり、結果として値になるため、を使用できますif/else

a = if true then 5 else 10
a = if false then 5 else 10

式の例について詳しくは、こちらをご覧ください


8
coffeescriptがjavascriptのデフォルトの3進構文をサポートしない理由があると思いますか?
Augustin Riedinger 2014年

41
その理由は、作成者が「不可解さ」が少なく恣意性の低いものを好むためです(たとえば、github.com/jashkenas/coffeescript/issues/11#issuecomment-97802)。[私の2セント-?:の恣意性を理解している間、私if..then..elseは簡潔な表現であることになっているものの代わりに冗長すぎると思います。そして?:結局のところ、多くの言語の間で非常に根深い標準であり、JavaScriptの間でもJavaScriptです。それにもかかわらず、それはこの段階で石で
固定

1
私はCoffeeScriptの作者に同意します。3進構文は醜くて直感的でないAFだといつも思っていました。if then else同じ行で使用できる場合は、それを実行してください。より明確でエレガントにするために、7文字追加されます。
Joshua Pinter

好みに依存しますが、高い信号対ノイズ比を見るのが好きで、キーワードが関数固有のロジック用に予約されており、操作ロジックがほとんど除外されているため、->over function{ }over などのキーワードよりもシンボルを強く好みbegin .. endますシンボルに。
mahemoff

非常に標準的な言語間構造であるものをすべて削除しようとすると、特にpugなどの他の「役立つ」ものを追加すると、メンテナンスをしている人を台無しにするだけです...すべての引数シーケンスとゴースト括弧を推測できない場合...
グルニオンシャトー


21

ほとんどすべての言語で、これは代わりに機能するはずです。

a = true  && 5 || 10
a = false && 5 || 10

38
これは機能しますが、あまり明確ではなく、構文が優れている言語で実行する理由はありません。
イブラヒム2013年

10
false0、null、未定義な​​どの値への暗黙的な変換がある多くの言語では同等ではありません
ロードオブグー

12
@Ibrahimこれは、マークの後の部分が真実である場合にのみ条件付き3項として機能します&&。それ以外の場合は、最後の部分を返しますが、これは条件付き3項の動作とは異なります。
pepkin88 2015

正確には、違い!:)
Pierre Voisin 2015年

すべての例の中で、これは私が遭遇する可能性がある任意の言語の変数が何であるかを伝えるのが最も難しいと思うものです-特に、スペースが常にスペースであるとは限らないCoffeeScript(またはRuby)のような言語
Toni Leigh

12

Coffeescript は、 javascript三項演算子をサポートしていません。ここにcoffeescriptの作者からの理由があります:

三項演算子は次の人と同じくらい好きですが(おそらく実際にはもう少し)、構文はそれらを良いものにするものではありません-if / elseを単一行に収まるので素晴らしいです式。

それらの構文は、暗記するための不可解な魔法のほんの少しのビットであり、言語の他のものには類似していません。結果は同じなので、どちらかと言えばif/elses常に同じに見える(そして常に式にコンパイルされる)ほうがいいです。

したがって、CoffeeScriptでは、else句のないifステートメントのように、複数行のifでも適切な場合に3進数にコンパイルされます。

if sunny   
  go_outside() 
else   
  read_a_book().

if sunny then go_outside() else read_a_book()

どちらも3項になり、式として使用できます。それは一貫していて、学ぶべき新しい構文はありません。だから、提案に感謝しますが、私はこのチケットを「wontfix」としてクローズします。

githubの問題を参照してください:https : //github.com/jashkenas/coffeescript/issues/11#issuecomment-97802


3

また、ほとんどが真の用途である場合は、次の2つのステートメントで記述することもできます。

a = 5
a = 10 if false

または、より多くの可能性が必要な場合は、switchステートメントを使用します。

a = switch x
  when true then 5
  when false then 10

ブール値ではサイズが大きくなる可能性がありますが、非常に読みやすいと思います。


1

複数行バージョン(たとえば、各行の後にコメントを追加する必要がある場合):

a = if b # a depends on b
then 5   # b is true 
else 10  # b is false

0

CoffeeScript三項演算子はありません。それはドキュメントが言うことです。

次のような構文を使用できます

a = true then 5 else 10

それははるかに明確です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.