कॉफीस्क्रिप्ट में टर्नरी ऑपरेशन


318

मुझे मान सेट करने की आवश्यकता है a जो एक शर्त पर निर्भर करता है।

कॉफीस्क्रिप्ट के साथ ऐसा करने का सबसे छोटा तरीका क्या है?

जैसे कि मैं इसे जावास्क्रिप्ट में कैसे करूंगा:

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

120
<rant> काश कॉफी स्क्रिप्ट बस सहायक टर्नरी ऑपरेटर सिंटैक्स का समर्थन कर सकती थी, यह छोटा है और पढ़ने में आसान है if else then </ rant>
AJP

2
@AJP मुझे लगता है कि टर्नरी कॉफी को रूबी-ईश बना देगा, भले ही रूबी के पास ऐसा हो। कॉफी के साथ लक्ष्य हमेशा पठनीयता है और किसी न किसी कोने से गोल है।
जुल्म

37
@jcollum ने सहमति व्यक्त की, लेकिन वास्तव में मुझे जो सबसे ज्यादा a = true ? 5 : 10अटपटा लगता है , वह है मान्य कॉफ़ीस्क्रिप्ट, लेकिन इसका मतलब टर्नरी संरचना नहीं है, इसके बजाय (जावास्क्रिप्ट में) इसका अर्थ है: a = true ? true : {5:10}जिसे एक बुरी चीज़ के रूप में जाना जाता है® इसके अलावा a = false ? {5 : 10}कॉफ़ीस्क्रिप्ट में (फिर जावास्क्रिप्ट में) समतुल्य: a = true ? false : {5:10} इसके लायक क्या है, मुझे नहीं लगता कि यह अच्छा है।
एजेपी

2
यह सबसे अच्छा के लिए बाहर हो सकता है अगर .. कॉफी के लिए। ? एक अस्तित्व के रूप में ऑपरेटर बहुत मायने रखता है: beast = yeti ? "bear"या काफी अच्छी तरह if yeti? then alert "It's a yeti!"से उपयोग करता ?है।
पॉल ओलिवर

3
कॉफ़ीस्क्रिप्ट में वास्तव में अलग टर्नरी ऑपरेटर आवश्यक नहीं है क्योंकि if/then/elseपहले से ही एक अभिव्यक्ति है और एक ही काम करता है। यदि आप वास्तव में इसे याद कर रहे हैं, तो आप इसकी बजाय सी या जावास्क्रिप्ट सिंटैक्स का उपयोग कर रहे हैं, इसकी वास्तव में आवश्यकता है। यदि यह पर्याप्त रूप से पढ़ने योग्य नहीं है, और यह कभी-कभी होता है, तो बस कोष्ठकों में पूरी अभिव्यक्ति लपेटें। ऑपरेटर ?को अधिक उपयोगी जांचों के लिए बख्शा गया है जो जावास्क्रिप्ट में अनुपस्थित हैं, जैसा कि @PaulOliver द्वारा पहले ही कहा गया है। एक्स्टेंशियल ऑपरेटर सबसे अच्छा है।
4

जवाबों:


544

चूंकि सब कुछ एक अभिव्यक्ति है, और इस प्रकार एक मूल्य होता है, आप बस उपयोग कर सकते हैं if/else

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

आप यहां अभिव्यक्ति के उदाहरणों के बारे में अधिक देख सकते हैं ।


8
मुझे लगता है कि जावास्क्रिप्ट डिफ़ॉल्ट टर्नरी सिंटैक्स का समर्थन नहीं करने के लिए कॉफ़ीस्क्रिप्ट का एक कारण है?
अगस्तिन रिडिंगरिंगर

41
कारण कुछ "कम गूढ़" और कम मनमानी (जैसे, github.com/jashkenas/coffeescript/issues/11#issuecomment-97802 ) के लिए निर्माता की प्राथमिकता है । [मेरे 2 सेंट - जबकि मुझे इसकी मनमानी का एहसास है ?:, मुझे लगता if..then..elseहै कि संक्षिप्त अभिव्यक्ति के लिए माना जाता है के लिए एक प्रतिस्थापन भी है। और ?: कई भाषाओं के बीच बहुत ही सघन मानक है, उनके बीच में जावास्क्रिप्ट। इस सब के बावजूद, यह इस स्तर पर पत्थर की तरह प्रतीत होता है।]
मैहेमॉफ

1
मैं कॉफीस्क्रिप्ट लेखक के साथ सहमत हूं, मैंने हमेशा त्रिशंकु वाक्यविन्यास को बदसूरत और अचिंत्य वायुसेना होने के लिए सोचा था। यदि आप if then elseएक ही लाइन पर उपयोग कर सकते हैं , तो इसे करें, यह अधिक स्पष्टता और लालित्य के लिए 7 अतिरिक्त वर्ण हैं।
जोशुआ पिंटर

स्वाद पर निर्भर करता है, लेकिन मेरे पास खोजशब्दों पर प्रतीकों के लिए एक मजबूत प्राथमिकता है, जैसे कि ->अधिक functionया { }अधिक begin .. end, क्योंकि मैं शोर अनुपात के लिए एक उच्च संकेत देखना पसंद करता हूं, जहां शब्द फ़ंक्शन-विशिष्ट तर्क के लिए आरक्षित होते हैं और परिचालन तर्क को अधिकतर पुनर्प्राप्त किया जाता है प्रतीकों को।
माहीमॉफ

पूरी तरह से ड्राइव करने के लिए जो बहुत मानक क्रॉस-लैंग्वेज स्ट्रक्चर्स हैं, वे वास्तव में ऐसे लोगों पर शिकंजा कसते हैं, जो रखरखाव कर रहे हैं, खासकर जब आप पग जैसी अन्य 'सहायक' चीजों में जोड़ते हैं ... यदि आप सभी तर्क अनुक्रम और भूत कोष्ठक का अनुमान नहीं लगा सकते हैं ...
ग्रुनियन शाफ़्टो


21

लगभग किसी भी भाषा में इसके बजाय काम करना चाहिए:

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

38
यह काम करता है, लेकिन यह बहुत कम स्पष्ट है और किसी भी भाषा में ऐसा करने का कोई कारण नहीं है जो इसके लिए एक बेहतर वाक्यविन्यास है।
इब्राहिम

10
यह कई भाषाओं में समतुल्य नहीं है जहाँ false0, अशक्त, अपरिभाषित, और इत्यादि जैसे मूल्यों का निहितार्थ रूपांतरण है
का भगवान

12
एक सशर्त त्रिगुट के रूप में यह काम करता है @Ibrahim केवल अगर बाद वाले हिस्से &&अंतिम भाग, नहीं कैसे सशर्त ternaries काम है जो निशान truthy है, अन्यथा यह वापसी होगी।
pepkin88

ठीक है, अंतर! :)
पियरे वोइसिन

espeically CoffeeScript (या रूबी) की तरह एक lanugage जहां रिक्त स्थान हमेशा रिक्त स्थान नहीं हैं - सब उदाहरण के, यह एक मैं सबसे क्या चर किसी भी भाषा में हैं मैं पर पहुंच जाएं, यह बताने के लिए मुश्किल पाते हैं है
टोनी लेह

12

Coffeescript जावास्क्रिप्ट ternary ऑपरेटर का समर्थन नहीं करता है । यहाँ कॉफ़ीस्क्रिप्ट लेखक से कारण है :

मुझे टर्नेरी संचालकों से उतना ही प्यार है जितना कि अगले आदमी (शायद थोड़ा और अधिक, वास्तव में) पर, लेकिन वाक्यविन्यास ऐसा नहीं है जो उन्हें अच्छा बनाता है - वे महान हैं क्योंकि वे एक पंक्ति में एक / एक के रूप में फिट हो सकते हैं अभिव्यक्ति।

उनका वाक्यविन्यास जादू को याद करने का एक और छोटा सा हिस्सा है, जिसमें भाषा में किसी भी चीज के लिए कोई एनालॉग नहीं है। परिणाम बराबर हो रहा है, मैं if/elsesहमेशा एक ही दिखना चाहता हूं (और हमेशा एक अभिव्यक्ति में संकलित किया जाता है)।

इसलिए, कॉफीस्क्रिप्ट में, बहु-पंक्ति इफ़्स भी जब उपयुक्त हो तब टर्नरीज़ में संकलित करेंगे, जैसे कि एक दूसरे खंड के बिना कथन:

if sunny   
  go_outside() 
else   
  read_a_book().

if sunny then go_outside() else read_a_book()

दोनों ही तीर्थ बन जाते हैं, दोनों को अभिव्यक्ति के रूप में इस्तेमाल किया जा सकता है। यह सुसंगत है, और सीखने के लिए कोई नया वाक्यविन्यास नहीं है। तो, सुझाव के लिए धन्यवाद, लेकिन मैं इस टिकट को "wontfix" के रूप में बंद कर रहा हूं।

कृपया github मुद्दे को देखें: https://github.com/jashkenas/coffeescript/issues/11#issuecomment-97802


3

आप इसे दो बयानों में भी लिख सकते हैं यदि यह अधिकतर सही उपयोग है:

a = 5
a = 10 if false

या यदि आपको अधिक संभावनाओं की आवश्यकता हो तो स्विच स्टेटमेंट का उपयोग करें:

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

यह रास्ता ज्यादा साफ है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.