Operasi ternary di CoffeeScript

318

Saya perlu menetapkan nilai untuk aitu tergantung pada suatu kondisi.

Apa cara terpendek untuk melakukan ini dengan CoffeeScript?

Misalnya ini adalah bagaimana saya melakukannya dalam JavaScript:

a = true  ? 5 : 10  # => a = 5
a = false ? 5 : 10  # => a = 10
evfwcqcg
sumber
120
<rant> Saya berharap skrip kopi bisa saja mendukung sintaksis operator ternary, lebih pendek dan lebih mudah dibaca daripada if else then </rant>
AJP
2
@ AJP Saya pikir ternary akan membuat kopi lebih sedikit Ruby-ish, meskipun Ruby memilikinya. Tujuannya dengan kopi selalu mudah dibaca dan membulatkan sudut-sudut yang kasar.
jcollum
37
@ jcollum setuju, tetapi apa yang saya temukan paling meresahkan adalah bahwa itu a = true ? 5 : 10adalah coffeescript yang valid, tetapi tidak berarti struktur ternary, sebaliknya (dalam javascript) artinya: a = true ? true : {5:10}yang dikenal sebagai hal yang buruk® Selain itu a = false ? {5 : 10}dalam coffeescript maka (dalam javascript) adalah setara dengan: a = true ? false : {5:10} Untuk apa nilainya, saya pikir itu tidak baik.
AJP
2
Mungkin yang terbaik untuk mengeja jika .. maka..selain untuk CoffeeScript. Itu? sebagai operator keberadaan sangat masuk akal: beast = yeti ? "bear"atau if yeti? then alert "It's a yeti!"memanfaatkannya dengan ?cukup baik.
Paul Oliver
3
Operator ternary yang terpisah tidak terlalu diperlukan dalam CoffeeScript karena if/then/elsesudah merupakan ekspresi dan melakukan hal yang sama. Jika Anda benar-benar melewatkannya, maka Anda lebih terbiasa dengan sintaks C atau JavaScript daripada benar-benar membutuhkannya. Jika itu tidak cukup dibaca, dan kadang-kadang itu terjadi, cukup bungkus seluruh ekspresi dalam tanda kurung. Operator ?telah diselamatkan untuk pemeriksaan yang lebih bermanfaat yang tidak ada dalam JavaScript, seperti yang telah dinyatakan oleh @PaulOliver. Operator eksistensial adalah yang terbaik.
skalee

Jawaban:

544

Karena semuanya adalah ekspresi, dan dengan demikian menghasilkan nilai, Anda bisa menggunakannya if/else.

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

Anda dapat melihat lebih banyak tentang contoh ekspresi di sini .

loganfsmyth
sumber
8
Saya kira ada alasan untuk coffeescript untuk tidak mendukung sintaks ternary javascript default?
Augustin Riedinger
41
Alasannya adalah preferensi pencipta untuk sesuatu yang "kurang samar" dan kurang sewenang-wenang (misalnya, github.com/jashkenas/coffeescript/issues/11#issuecomment-97802 ). [2 sen saya - Sementara saya menyadari kesewenang-wenangan?:, Saya pikir if..then..elseterlalu banyak pengganti untuk apa yang seharusnya menjadi ekspresi singkat. Dan?: Apakah standar yang sudah tertanam di antara banyak bahasa, JavaScript di antara mereka. Terlepas dari semua itu, tampaknya akan dibuat batu pada tahap ini.]
mahemoff
1
Saya setuju dengan penulis CoffeeScript, saya selalu berpikir sintaksis ternary adalah AF yang jelek dan tidak intuitif. Jika Anda dapat menggunakan if then elsepada baris yang sama, lakukan, itu adalah 7 karakter tambahan untuk kejelasan dan keanggunan yang jauh lebih banyak.
Joshua Pinter
Tergantung selera, tetapi saya memiliki preferensi yang kuat untuk simbol daripada kata kunci, seperti ->lebih functionatau { }lebih begin .. end, karena saya suka melihat rasio sinyal terhadap noise yang tinggi, di mana kata-kata dicadangkan untuk logika fungsi-spesifik dan logika operasional sebagian besar diturunkan. untuk simbol.
mahemoff
Seluruh drive untuk menghapus struktur lintas-bahasa yang sangat standar benar-benar hanya mengacaukan orang yang melakukan pemeliharaan, terutama ketika Anda menambahkan hal-hal 'membantu' lainnya seperti pesek ... Jika Anda tidak dapat menyimpulkan semua urutan argumen dan kurung hantu ...
Grunion Shaftoe
68
a = if true then 5 else 10
a = if false then 5 else 10 

Lihat dokumentasi .

Paul Oliver
sumber
21

Dalam hampir semua bahasa ini seharusnya berfungsi sebagai gantinya:

a = true  && 5 || 10
a = false && 5 || 10
Alexander Senko
sumber
38
Ini berfungsi, tetapi jauh lebih tidak jelas dan tidak ada alasan untuk melakukannya dalam bahasa apa pun yang memiliki sintaks yang lebih baik.
Ibrahim
10
Ini tidak setara dalam banyak bahasa di mana ada konversi implisit ke falsenilai-nilai seperti 0, nol, tidak terdefinisi, ... dan seterusnya
Lord of the Goo
12
@Ibrahim Ini berfungsi sebagai terner kondisional hanya jika bagian setelah &&tanda benar, jika tidak akan mengembalikan bagian terakhir, yang bukan cara kerja kondiser kondisional.
pepkin88
Justru bedanya! :)
Pierre Voisin
dari semua contoh, ini yang saya temukan paling sulit untuk mengatakan apa variabel dalam bahasa tertentu yang mungkin saya temui - khususnya bahasa seperti CoffeeScript (atau Ruby) di mana spasi tidak selalu spasi
Toni Leigh
12

Coffeescript tidak mendukung operator ternary javascript. Inilah alasan dari penulis naskah :

Saya suka operator ternary sama seperti orang berikutnya (mungkin sedikit lebih, sebenarnya), tetapi sintaksnya bukan apa yang membuat mereka baik - mereka hebat karena mereka dapat memuat if / else pada satu baris sebagai ekspresi.

Sintaks mereka hanyalah sedikit sihir yang membingungkan untuk dihafal, tanpa analog dengan hal lain dalam bahasa tersebut. Hasilnya sama, saya lebih suka if/elsesselalu terlihat sama (dan selalu dikompilasi menjadi ekspresi).

Jadi, dalam CoffeeScript, bahkan multi-line ifs akan dikompilasi ke dalam terner saat yang tepat, seperti halnya jika pernyataan tanpa klausa lain:

if sunny   
  go_outside() 
else   
  read_a_book().

if sunny then go_outside() else read_a_book()

Keduanya menjadi terner, keduanya dapat digunakan sebagai ekspresi. Itu konsisten, dan tidak ada sintaks baru untuk dipelajari. Jadi, terima kasih atas sarannya, tapi saya menutup tiket ini sebagai "wontfix".

Silakan merujuk ke masalah github: https://github.com/jashkenas/coffeescript/issues/11#issuecomment-97802

Max Peng
sumber
3

Anda juga dapat menulisnya dalam dua pernyataan jika sebagian besar benar digunakan:

a = 5
a = 10 if false

Atau gunakan pernyataan peralihan jika Anda membutuhkan lebih banyak kemungkinan:

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

Dengan boolean mungkin terlalu besar tetapi saya merasa sangat mudah dibaca.

Alinex
sumber
1

Versi multiline (mis. Jika Anda perlu menambahkan komentar setelah setiap baris):

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

CoffeeScripttidak memiliki operator ternary. Itu yang dikatakan dokter.

Anda masih dapat menggunakan sintaksis seperti

a = true then 5 else 10

Jauh lebih jelas.

Эд Лесничий
sumber