लॉजिकल ऑपरेटर्स (जैसे, || && आदि) के लिए कोई कंपाउंड असाइनमेंट ऑपरेटर क्यों नहीं हैं?


20

ECMA-262 के अनुसार, भाग 11.13, निम्नलिखित यौगिक असाइनमेंट ऑपरेटरों की संपूर्ण सूची है *= /= %= += -= <<= >>= >>>= &= ^= |=:।

हिस्सा 11.11 के अनुसार, var c = a || bडाल देंगे aमें मूल्य cयदि ToBoolean(a)सच है और रखा जाएगा bमें मूल्य cअन्यथा। जैसे, तार्किक या अक्सर कोलेसस ऑपरेटर के रूप में उपयोग किया जाता है, जैसे

function (options) {
    options = options || {};
}

अक्सर पर्याप्त, चर का उपयोग चर के लिए डिफ़ॉल्ट मान को निर्दिष्ट करने के लिए किया जाता है, जैसा कि ऊपर दिखाया गया था a = a || b:।

ऐसा लगता है कि कंपाउंड असाइनमेंट ऑपरेटर ||=वास्तव में उपयोगी होगा, जिससे कोड को छोटे और साफ-सुथरे तरीके से ऊपर लिखा जा सकेगा a ||= b:। हालांकि, यह वहां नहीं है (हालांकि *=, +=और अन्य मिश्रित असाइनमेंट ऑपरेटर हैं)।

सवाल है, क्यों?


2
मैं अविश्वसनीय रूप से हैरान हूं कि% = ऑपरेटर भी मौजूद है। किसने तय किया कि आवश्यक था? इनमें से कुछ ऑपरेटर खराब भाषा डिजाइन निर्णयों की तरह लगते हैं।
जोनाथन रिच

2
@ जोनाथनरिच:% = क्यों नहीं है? यदि आप इनमें से किसी भी असाइनमेंट ऑपरेटर के पास जा रहे हैं, तो जल्द ही या बाद में कुछ डेवलपर (जैसे कि पेनार्टूर) आश्चर्य करेंगे कि ऑपरेटर दूसरों की तुलना में "अधिक समान" क्यों हैं।
केविन क्लाइन

4
@JonathanRich क्रिप्टो मापांक का महत्वपूर्ण उपयोग करता है। Furthemore, वहाँ गणित काम ऑपरेटरों के लिए गणित के बाकी के साथ एक वांछित ओर्थोगोनालिटी है (यदि कोई उम्मीद +=, *=, -=, /=, क्यों नहीं होगा %=काम?)।

4
@JonathanRich: ऑपरेटर तब काम आता है जब आपके पास कुछ परिपत्र होता है और इसे सामान्य करना चाहते हैं, उदाहरण के लिए ( angle %= 360या vertexIndex %= numberOfVerticesएक बंद बहुभुज की शीर्ष सूची के लिए)।
सेबस्टियन नेग्रास्ज़स

जवाबों:


12

एक संभावित कारण यह है कि तार्किक ऑपरेटरों &&और ||"शॉर्ट-सर्कुलेटिंग" व्यवहार है। जब तक आवश्यक न हो, दाहिने हाथ का संचालन &&और ||मूल्यांकन नहीं किया जाता है। शायद इस कारण से भाषा डिजाइनरों ने फैसला किया कि अभिव्यक्ति का अर्थ a ||= f()स्पष्ट नहीं था, और इसलिए ऐसे ऑपरेटरों को बेहतर रूप से छोड़ दिया गया था।


2
हाँ। उदाहरण के लिए, बहुत से लोग मानते हैं कि a ||= bइसकी व्याख्या की जानी चाहिए a = a || b, लेकिन वास्तव में यह a || a = b( रूबी की तरह ) हो सकता है। सेटर का साइड इफेक्ट होने पर वे अलग हो सकते हैं । एक को चुनना दूसरे शिविर में उपयोगकर्ताओं के लिए बुरा हो सकता है। मुझे व्यक्तिगत रूप से a || a = bतरीका (रूबी तरीका) पसंद है, लेकिन मुझे यकीन नहीं है कि हर कोई इससे खुश है।
फ्रैंकलिन यू

8

"यह भाषा सुविधा क्यों लागू नहीं की गई" के बारे में सभी सवालों का सामान्य उत्तर यह है कि भाषा को डिजाइन करने वाली टीम ने फैसला किया कि लाभ लागत से बाहर नहीं था।

लागत कई रूप ले सकती है। भाषा की विशेषता को लागू करने में समय और प्रयास लगता है, लेकिन जटिलता की आंतरिक लागत भी है: क्या यह सुविधा भाषा को अधिक जटिल या अस्पष्ट बना देती है, अपने संभावित लाभ के अनुपात से बाहर?

काल्पनिक ||=संचालक अन्य यौगिक असाइनमेंट ऑपरेटरों से मौलिक रूप से कुछ अलग करता है। जबकि अन्य संचालक प्रकृति में विशुद्ध रूप से गणितीय हैं, यह एक अलग है: यह एक मान को दूसरे के लिए प्रतिस्थापित करता है (आपके द्वारा वर्णित संदर्भ में)।

इस अस्पष्टता को देखते हुए (ऑपरेटर संदर्भ के आधार पर दो अलग-अलग कार्य करता है), यह देखना मुश्किल नहीं है कि इसे भाषा में शामिल क्यों नहीं किया गया। यद्यपि आप कहते हैं कि बदल रहा है

function (options) {
    options = options || {};
}

सेवा

function (options) {
    options ||= {};
}

अशक्त सहानुभूति प्रदर्शन करने के लिए एक मूल्यवान विशेषता है, लाभ मेरे लिए बहुत कम स्पष्ट है। यदि मूल्य प्रतिस्थापन होता है, तो ऐसा लगता है कि इस तरह के प्रतिस्थापन हो सकते हैं एक दृश्य संकेत प्रदान करने के लिए, बराबर चिह्न के दाईं ओर दोनों मान होना तर्कसंगत (और स्पष्ट) लगता है।

C # ने एक अलग रास्ता लिया, और अशक्त तालमेल के लिए एक विशिष्ट ऑपरेटर का उपयोग करता है ।


1
कोड पढ़ते समय, पहला उदाहरण वहां अधिक स्वाभाविक रूप से पढ़ता है - "विकल्प विकल्प या कुछ नहीं के बराबर है" - दूसरे की तुलना में - "विकल्प या कुछ भी नहीं के बराबर"। मुझे लगता है कि यह "या बराबरी" ऑपरेटर को शामिल नहीं करने का सिर्फ एक और कारण है
एंडी हंट

आपके उत्तर के लिए उत्कृष्ट उद्घाटन। और मुझे लगता है कि आपके उत्तर की शुरुआत टैग के लिए विकि के भीतर है।

3
@AndyBursh वही तर्क किसी भी कंपाउंड असाइनमेंट ऑपरेटर पर लागू किया जा सकता है। "एक्स एक्स 2 2 के बराबर" एक्स एक्स 2 2 की तुलना में अधिक स्वाभाविक रूप से पढ़ता है।
14

2
ध्यान दें कि टाइपिंग के foo = foo || barलिए आपको fooदो बार टाइप करना होगा । यह दोनों बोझिल है और रिफ्लेक्टिंग टाइपोस के लिए भी प्रवण है।
फ्रॉग्ज

1
मुझे लगता है कि आप "गणितीय" का अर्थ गलत समझते हैं, शायद आपने बूलियन बीजगणित के बारे में सुना है। मैं मानता हूं कि एक गैर-बूलियन के ||=रूप में उपयोग करने के लिए जोर-जबरदस्ती करने वाला एक सुसंगत ऑपरेटर के रूप में उपयोग करने के लिए सहज नहीं है और वास्तव में कोड-रूप में अप्रिय दिखता है। जहां यह उपयोगी हो जाता है, जब आप बूलियन गणित करने का प्रयास कर रहे हैं। function fulfill(inValue) { if(resolved || rejected) return false; /* Do stuff here */ return true; } resolved ||= fulfill(value)
joshperry

3

आप सही हैं कि ||=एक उपयोगी निर्माण है। यह पर्ल में मौजूद है।

वास्तव में पर्ल इन सभी को उपलब्ध कराता है:

**=    +=    *=    &=    <<=    &&=   -=    /=    
|=     >>=   ||=   .=    %=     ^=    //=   x=

इनमें से कुछ महान हैं ( .=एक स्ट्रिंग के अंत में कुछ जोड़ता है), दूसरों को कम (इसलिए &&=मुझे लगता है कि चर सही पक्ष पर सेट हो जाएगा अगर यह और चर दोनों सत्य हैं। लेकिन आप कभी ऐसा क्यों करेंगे। ?)

किसी भाषा में जो कुछ भी शामिल है, वह वास्तव में उसके डिजाइन दर्शन की एक विशेषता है।


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