Hoạt động ternary trong CoffeeScript


318

Tôi cần đặt giá trị ađó phụ thuộc vào một điều kiện.

Cách ngắn nhất để làm điều này với CoffeeScript là gì?

Ví dụ: đây là cách tôi làm trong JavaScript:

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

120
<rant> Tôi muốn tập lệnh cà phê có thể vừa hỗ trợ cú pháp toán tử tạm thời, nó ngắn hơn và dễ đọc hơn if else then </ rant>
AJP

2
@AJP Tôi nghĩ rằng chim nhạn sẽ làm cho cà phê bớt Ruby-ish, mặc dù Ruby có điều đó. Mục tiêu với cà phê luôn là khả năng đọc và làm tròn các góc thô.
jcollum

37
@jcollum đồng ý, nhưng những gì thực sự tôi thấy đáng lo ngại nhất là a = true ? 5 : 10là coffeescript hợp lệ, nhưng không có nghĩa là một cấu trúc bậc ba, thay vì (trong javascript) nó có nghĩa là: a = true ? true : {5:10}được biết đến như một xấu thing® Ngoài ra a = false ? {5 : 10}trong coffeescript sau đó (trong javascript) là tương đương với: a = true ? false : {5:10} Đối với những gì nó có giá trị, tôi không nghĩ nó tốt.
AJP

2
Nó có thể là tốt nhất để đánh vần nếu..then..else cho CoffeeScript. Các ? như một toán tử tồn tại có rất nhiều ý nghĩa: beast = yeti ? "bear"hoặc if yeti? then alert "It's a yeti!"sử dụng ?khá tốt.
Paul Oliver

3
Toán tử ternary riêng biệt không thực sự cần thiết trong CoffeeScript vì if/then/elseđây đã là một biểu thức và thực hiện điều tương tự. Nếu bạn thực sự thiếu nó, thì bạn đã quen với cú pháp C hoặc JavaScript hơn là thực sự cần nó. Nếu nó không đủ để đọc và đôi khi nó xảy ra, chỉ cần bọc toàn bộ biểu thức trong ngoặc đơn. Toán tử ?đã được tha cho các kiểm tra hữu ích hơn mà không có trong JavaScript, như đã được @PaulOliver nêu. Toán tử tồn tại là tốt nhất.
skalee

Câu trả lời:


544

Vì mọi thứ đều là biểu thức và do đó dẫn đến một giá trị, bạn chỉ có thể sử dụng if/else.

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

Bạn có thể xem thêm về các ví dụ biểu hiện ở đây .


8
Tôi đoán có một lý do cho coffeescript không hỗ trợ cú pháp ternary mặc định javascript?
Augustin Riedinger

41
Lý do là sở thích của người sáng tạo cho một cái gì đó "ít khó hiểu hơn" và ít độc đoán hơn (ví dụ: github.com/jashkenas/coffeescript/issues/11#issuecomment-97802 ). [2 xu của tôi - Trong khi tôi nhận ra sự độc đoán của?:, Tôi nghĩ rằng if..then..elsequá dài dòng thay thế cho những gì được cho là một biểu hiện ngắn gọn. Và?: Rốt cuộc là một tiêu chuẩn rất ăn sâu giữa nhiều ngôn ngữ, JavaScript trong số đó. Mặc dù tất cả những điều đó, nó dường như được đặt trong giai đoạn này.]
mahemoff

1
Tôi đồng ý với tác giả CoffeeScript, tôi luôn nghĩ cú pháp tạm thời là AF xấu xí và không trực quan. Nếu bạn có thể sử dụng if then elsetrên cùng một dòng, hãy thực hiện, đó là 7 ký tự bổ sung để rõ ràng và thanh lịch hơn nhiều.
Joshua Pinter

Tùy thuộc vào sở thích, nhưng tôi có sở thích mạnh mẽ đối với các ký hiệu đối với các từ khóa, chẳng hạn như ->hơn functionhoặc { }hơn begin .. end, vì tôi muốn thấy tỷ lệ nhiễu tín hiệu cao, trong đó các từ được dành riêng cho logic cụ thể của chức năng và logic hoạt động chủ yếu bị loại bỏ để biểu tượng.
mahemoff

Toàn bộ ổ đĩa để loại bỏ các cấu trúc ngôn ngữ chéo rất chuẩn thực sự chỉ làm hỏng những người đang bảo trì, đặc biệt là khi bạn thêm vào những thứ 'hữu ích' khác như pug ... Nếu bạn không thể suy ra tất cả các chuỗi đối số và dấu ngoặc đơn ma ...
Grunion Shaftoe


21

Trong hầu hết mọi ngôn ngữ, điều này sẽ hoạt động thay thế:

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

38
Điều này hoạt động, nhưng nó ít rõ ràng hơn và không có lý do để làm điều đó trong bất kỳ ngôn ngữ nào có cú pháp tốt hơn cho nó.
Ibrahim

10
Nó không tương đương trong nhiều ngôn ngữ khi có sự chuyển đổi ngầm định thành falsecác giá trị như 0, null, không xác định, và v.v.
Lord of the Goo

12
@Ibrahim Điều này hoạt động như một ternary điều kiện chỉ khi phần sau &&dấu là đúng, nếu không nó sẽ trả lại phần cuối cùng, đó không phải là cách mà các ternary có điều kiện hoạt động.
pepkin88 8/2/2015

Chính xác, sự khác biệt! :)
Pierre Voisin

trong tất cả các ví dụ, đây là điều mà tôi thấy khó hiểu nhất để nói các biến trong ngôn ngữ đã cho mà tôi có thể gặp - đặc biệt là một lanugage như CoffeeScript (hoặc Ruby) nơi không gian luôn luôn là khoảng trắng
Toni Leigh

12

Coffeescript không hỗ trợ toán tử ternary javascript. Đây là lý do từ tác giả coffeescript :

Tôi yêu các nhà điều hành ternary nhiều như anh chàng tiếp theo (thực tế là nhiều hơn một chút), nhưng cú pháp không phải là điều làm cho họ tốt - họ thật tuyệt vì họ có thể phù hợp với một / một dòng khác như một biểu hiện.

Cú pháp của họ chỉ là một chút ma thuật huyền bí để ghi nhớ, không giống với bất kỳ thứ gì khác trong ngôn ngữ. Kết quả là như nhau, tôi muốn thay vì if/elsestrông giống nhau (và luôn được biên dịch thành một biểu thức).

Vì vậy, trong CoffeeScript, ngay cả các if đa dòng sẽ biên dịch thành các ternary khi thích hợp, cũng như các câu lệnh nếu không có mệnh đề khác:

if sunny   
  go_outside() 
else   
  read_a_book().

if sunny then go_outside() else read_a_book()

Cả hai đều trở thành chim nhạn, cả hai có thể được sử dụng như biểu thức. Nó phù hợp và không có cú pháp mới để tìm hiểu. Vì vậy, cảm ơn vì lời đề nghị, nhưng tôi sẽ đóng vé này dưới dạng "wontfix".

Vui lòng tham khảo vấn đề github: https://github.com/jashkenas/coffeescript/issues/11#issuecomment-97802


3

Bạn cũng có thể viết nó thành hai câu nếu nó chủ yếu là sử dụng đúng:

a = 5
a = 10 if false

Hoặc sử dụng câu lệnh chuyển đổi nếu bạn cần nhiều khả năng hơn:

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

Với một boolean nó có thể quá khổ nhưng tôi thấy nó rất dễ đọc.


1

Phiên bản nhiều dòng (ví dụ: nếu bạn cần thêm nhận xét sau mỗi dòng):

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

0

CoffeeScriptkhông có toán tử ternary. Đó là những gì các tài liệu nói.

Bạn vẫn có thể sử dụng một cú pháp như

a = true then 5 else 10

Nó rõ ràng hơn nhiều.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.