2011-09-18 4 views
7

के माध्यम से जावास्क्रिप्ट में ऑपरेटर ओवरलोडिंग को कार्यान्वित करना जावास्क्रिप्ट के साथ, हम में से कुछ के लिए ऑपरेटर ओवरलोडिंग की कमी है। यह संख्यात्मक पुस्तकालयों को अजीब लिखता है। उदाहरण के लिए, हम कुछ लिखना चाहेंगे:एक ट्रांसलेटर

var a = new BigInteger(5); 
var b = new BigInteger(10); 
var c = a + b; 

एक संभावित समाधान जावास्क्रिप्ट को ऑपरेटर ओवरलोडिंग के साथ एक भाषा को पारदर्शी करना है। व्यवहार्य होने पर - ऑपरेटर को फ़ंक्शन कॉल और टाइप चेक द्वारा प्रतिस्थापित करके - आम सहमति यह प्रतीत होती है कि प्रदर्शन को मारने के बिना यह असंभव है। CoffeeScript इस कारण के लिए विचार को अस्वीकार कर दिया गया है:

https://github.com/jashkenas/coffee-script/issues/846

लेकिन वहाँ वास्तव में कोई चतुर समाधान कर रहे हैं?

उदाहरण के लिए, यह संभवतः उछाल वाले प्रकारों को तंग लूप से बाहर कर सकता है या कुछ अन्य पाइपलाइन का उपयोग करने के लिए हो सकता है जहां आधुनिक जेएस कंपाइलर संख्यात्मक क्रुफ़्ट को अनुकूलित कर सकते हैं जब प्रकार संख्यात्मक होते हैं।

विचार?

वे परिभाषित है कि हर ऑपरेटर एक वस्तु पर एक विधि कॉल है, इसलिए अपने उदाहरण होगा:

var c = a["+"](b); 

आप यहाँ रोक, तो आप कर सकते थे

+0

हो सकता है आप कर सकते थे हंगेरी अंकन के साथ नकली स्थिर टाइपिंग? यदि आप निश्चित रूप से कहीं भी एक प्रकार का मिश्रण करते हैं, तो आपका कोड शानदार त्रुटि के बिना उड़ाएगा। – evan

+0

यहां एक लेख है। जे एस ऑपरेटर ओवरलोडिंग ... http://www.2ality.com/2011/12/fake-operator-overloading.html –

उत्तर

1

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

+1

यह तभी काम करता है आप स्क्रैच से भाषा को फिर से डिज़ाइन कर रहे हैं (जैसा कि स्काला के साथ भी थी)। आप वास्तव में एक लहर पर एक बहुरूपी एक में एक monomorphic ऑपरेटर बदल सकते हैं नहीं :( – hugomg

2

क्या आप वाकई सुनिश्चित हैं कि आपको अपनी बड़ी आवश्यकता है संख्याओं को सामान्य संख्याओं के साथ लिखे गए पुराने कार्यों द्वारा उपयोग करने योग्य संख्या (पारंपरिक ऑपरेटरों का उपयोग करें)? यदि आपको केवल उन कार्यों पर अपनी सुविधा के लिए ओवरलोडिंग की आवश्यकता है जो आप पर नियंत्रण रखते हैं तो आप अलग-अलग, कस्टम ऑपरेटर का उपयोग करके साइन इन करने में सक्षम हो सकते हैं।

उदाहरण के लिए, यदि आप एक संकलक लिखने सुरक्षित रूप से

var d = (a).add((b).multiply(c)); 

या शायद में

var d = a <+> b <*> c; 

कन्वर्ट करने के लिए कर सकता है, तो आप स्वत: रूपांतरण चाहते हैं, तो ...

var d = toBignum(a).add(toBignum(b).multiply(toBignum(c))); 

मैं वास्तव में आपको बीई नहीं देखता हूं एक बड़ी परेशानी के बिना मौजूदा कार्यान्वयन पर अधिभार को मजबूर करने में सक्षम है। जबकि आप < +> के साथ + के सभी अवसरों को सैद्धांतिक रूप से प्रतिस्थापित कर सकते हैं और इसी तरह, वर्तमान जावास्क्रिप्ट कार्यान्वयन इस के लिए अनुकूलित नहीं किए गए हैं और मैं यह भी सोचना शुरू नहीं करना चाहूंगा कि क्या होगा यदि आप मूल में से किसी एक को बिग्नम पास करने का प्रयास करते हैं सी ++ फ़ंक्शन जो हुड के नीचे हैं।


संपादित करें: आधार पूर्णांक वर्ग ओवरराइड करने के लिए की आवश्यकता होगी, नहीं (अधिभावी पहली बात पुरुष चाहता है ... ध्यान दें कैसे लिंक आप दे दी है में) यहाँ महत्वपूर्ण बात है। मुझे नहीं लगता कि आप किसी तरह का "जादू" अनुकूलन ढूंढ पाएंगे, हालांकि आपके पास कोई नियंत्रण नहीं है कि क्लाइंट द्वारा कई जेएस कार्यान्वयन का उपयोग किया जा रहा है।

यदि आपको वास्तव में एक कस्टम ऑपरेटर पसंद नहीं है जैसे < +> एक फैंसी + ऑपरेटर (आप के साथ बिग्नम सामान करना चाहते हैं) से सामान्य + ऑपरेटर (आप shdln't meddle with) को अलग करने का एकमात्र तरीका नहीं करेंगे जावास्क्रिप्ट के शीर्ष पर किसी प्रकार की एड-हाॉक टाइपिंग सिस्टम को मजबूर करना, शायद टिप्पणियों, कस्टम वाक्यविन्यास या (जैसा टिप्पणी में उल्लिखित) हंगेरी नोटेशन के माध्यम से। एक कस्टम ऑपरेटर नाम के लिए बस बसने से आप कम नफरत करेंगे, आईएमओ कम है।

+0

मैं पुराने जावास्क्रिप्ट कार्यों के बारे में चिंतित नहीं हूँ। और <+> जैसे नए वाक्य रचना, मेरे स्वाद के लिए एक हैक की बहुत अधिक है + के बाद से क्या मतलब है। मेरे आशा कुछ ज्ञात अनुकूलन कि संकलक कि इस्तेमाल किया जा सकता में पर चला जाता है है कि वहाँ है। – Tristan

+0

जवाब संपादित ... – hugomg

संबंधित मुद्दे