दिलचस्प पोस्ट
एंड्रॉइड-एनडीके के साथ FFmpeg का उपयोग करना कैसे SQL सर्वर से एक पासवर्ड डिक्रिप्ट करने के लिए? एक स्थापित एनपीएम पैकेज का संस्करण खोजें त्रुटि: प्रकार 'इंट' के प्रकार के 'आरएंडटी' से गैर-कॉन्स्ट संदर्भ का अमान्य प्रारंभ php: कर्ल के साथ html स्रोत कोड प्राप्त करें मैं जावा में जेपीनल्स कैसे ढेर कर सकता हूँ? पीडीबी फाइलें रिलीज़ करना, क्यों? पृष्ठभूमि वार्नर को रद्द करने के लिए कैसे इंतजार करना है? void_t "अवधारणाओं को लागू कर सकता है"? Windows JAVA_HOME को अनदेखा करता है: कैसे डिफ़ॉल्ट के रूप में JDK सेट करें? त्रुटि: Servlet जार लोड नहीं है … आक्रमण वर्ग: javax / servlet / Servlet.class यह एक अंतरफलक से एक वस्तु बनाने के लिए प्रतीत होता है; यह कैसे काम करता है? एकाधिक ईवेंट श्रोताओं को एक तत्व में जोड़ना वेबड्राइवर 45.05 एमएस के बाद पोर्ट 7055 पर 127.0.0.1 होस्ट करने के लिए कनेक्ट करने में असमर्थ मैं सभी घटकों में कुंजी प्रेस (जावा स्विंग के भीतर) के लिए कैसे सुन सकता हूँ?

क्यों नहीं रूबी समर्थन पद्धति ओवरलोडिंग समर्थन करता है?

रूबी को मौजूदा तरीकों को ओवरराइट करने के तरीकों का समर्थन करने के बजाय क्या कोई यह समझा सकता है कि भाषा इस तरीके से क्यों डिजाइन की गई थी?

Solutions Collecting From Web of "क्यों नहीं रूबी समर्थन पद्धति ओवरलोडिंग समर्थन करता है?"

विधि अधिभार एक ही नाम और विभिन्न हस्ताक्षर के साथ दो विधियों को घोषित करके प्राप्त किया जा सकता है। ये अलग हस्ताक्षर या तो हो सकते हैं,

  1. विभिन्न डेटा प्रकारों के साथ तर्क, उदाहरण: method(int a, int b) vs method(String a, String b)
  2. तर्कों की परिवर्तनीय संख्या, जैसे: method(a) vs method(a, b)

हम पहले तरीके का उपयोग करके ओवरलोडिंग विधि को प्राप्त नहीं कर सकते क्योंकि रूबी ( डायनेमिक टाइप की गई भाषा ) में डेटा प्रकार की घोषणा नहीं है। तो उपरोक्त विधि को परिभाषित करने का एकमात्र तरीका def(a,b)

दूसरे विकल्प के साथ, यह लग सकता है कि हम विधि अधिभार प्राप्त कर सकते हैं, लेकिन हम ऐसा नहीं कर सकते। मान लीजिए मेरे अलग-अलग तर्कों के साथ दो तरीके हैं,

 def method(a); end; def method(a, b = true); end; # second argument has a default value method(10) # Now the method call can match the first one as well as the second one, # so here is the problem. 

इसलिए रूबी को विधि में एक विधि को बनाए रखने की आवश्यकता है जिसमें अनूठे नाम के साथ चेन को देखें।

"ओवरलोडिंग" एक शब्द है जो रूबी में बस अर्थ नहीं करता है। यह मूल रूप से "स्थिर तर्क-आधारित प्रेषण" के लिए एक पर्याय है, लेकिन रूबी में स्थिर प्रेषण बिल्कुल नहीं है । इसलिए, रूबी तर्कों के आधार पर स्थैतिक प्रेषण का समर्थन नहीं करता है, इसका कारण यह है कि यह स्थिर प्रेषण, अवधि का समर्थन नहीं करता है। यह किसी तरह के स्थैतिक प्रेषण का समर्थन नहीं करता है, चाहे तर्क-आधारित या अन्यथा।

अब, यदि आप वास्तव में विशेष रूप से अधिभार के बारे में नहीं पूछ रहे हैं, लेकिन शायद गतिशील तर्क-आधारित प्रेषण के बारे में, तो इसका उत्तर है: क्योंकि मैत्ज़ ने इसे लागू नहीं किया था क्योंकि किसी और को इसके प्रस्ताव का कोई ख्याल नहीं है। क्योंकि किसी और को इसे लागू करने की परवाह नहीं है।

वैकल्पिक तर्कों और चर-लंबाई तर्क सूचियों वाले सामान्य भाषा में गतिशील तर्क-आधारित प्रेषण, सही पाने के लिए बहुत मुश्किल है, और यह समझने में भी मुश्किल है यहां तक ​​कि स्थिर तर्क-आधारित प्रेषण और बिना वैकल्पिक तर्क (जैसे जावा, उदाहरण के लिए) के साथ भाषाओं में, कभी-कभी केवल एक नश्वर के लिए कहना असंभव है, जो अधिभार को चुना जा रहा है।

सी # में, आप वास्तव में अधिभार संकल्प में किसी भी 3-SAT समस्या को सांकेतिक शब्दों में बदल सकते हैं, जिसका अर्थ है कि सी # में अधिभार संकल्प एनपी-हार्ड है

अब गतिशील प्रेषण के साथ प्रयास करें, जहां आपके पास अपने सिर में रखने के लिए अतिरिक्त समय आयाम है।

ऐसी भाषाओं हैं जो एक प्रक्रिया के सभी तर्कों के आधार पर गतिशील रूप से प्रेषित होती हैं, जैसा कि ऑब्जेक्ट-ओरिएंटेड भाषाओं के विपरीत है, जो केवल "छिपी" श्वेत self तर्क पर प्रेषित होता है। सामान्य लिस्प, उदाहरण के लिए, गतिशील प्रकारों पर प्रेषण और सभी तर्कों के गतिशील मूल्य भी। क्लोज़र सभी तर्कों (जो बीटीडब्ल्यू अत्यंत शांत और अत्यंत शक्तिशाली है) के एक मनमाने ढंग से कार्य पर प्रेषित होता है

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

मुझे लगता है कि आप ऐसा करने की क्षमता की तलाश कर रहे हैं:

 def my_method(arg1) .. end def my_method(arg1, arg2) .. end 

रूबी एक अलग तरीके से इसे समर्थन करता है:

 def my_method(*args) if args.length == 1 #method 1 else #method 2 end end 

हैश के रूप में विकल्पों में से एक सामान्य पैटर्न भी पारित करना है:

 def my_method(options) if options[:arg1] and options[:arg2] #method 2 elsif options[:arg1] #method 1 end end my_method arg1: 'hello', arg2: 'world' 

उम्मीद है की वो मदद करदे

विधि ओवरलोडिंग स्थिर टाइपिंग के साथ एक भाषा में समझ में आता है, जहां आप विभिन्न प्रकार के तर्कों के बीच भेद कर सकते हैं

 f(1) f('foo') f(true) 

साथ ही अलग-अलग तर्कों के बीच भी

 f(1) f(1, 'foo') f(1, 'foo', true) 

रूबी में पहला अंतर मौजूद नहीं है। रूबी डायनामिक टाइपिंग या "बतख टंकण" का उपयोग करता है दूसरा अंतर डिफ़ॉल्ट तर्कों या तर्कों के साथ काम करके नियंत्रित किया जा सकता है:

 def f(n, s = 'foo', flux_compensator = true) ... end def f(*args) case args.size when ... when 2 ... when 3 ... end end 

यह इस सवाल का जवाब नहीं देता कि रूबी में विधि का अधिभार नहीं है, लेकिन तीसरे पक्ष के पुस्तकालय इसे प्रदान कर सकते हैं।

ठेके.र्यूब लाइब्रेरी ओवरलोडिंग की अनुमति देती है। ट्यूटोरियल से अनुकूलित उदाहरण:

 class Factorial include Contracts Contract 1 => 1 def fact(x) x end Contract Num => Num def fact(x) x * fact(x - 1) end end # try it out Factorial.new.fact(5) # => 120 

ध्यान दें कि यह वास्तव में जावा के ओवरलोडिंग से अधिक शक्तिशाली है, क्योंकि आप मैच के लिए मान निर्दिष्ट कर सकते हैं (उदाहरण 1 ), न केवल प्रकार

यद्यपि आप इसका उपयोग करते हुए कम प्रदर्शन देखेंगे; आपको बेंचमार्क चलाने के लिए तय करना होगा कि आप कितना बर्दाश्त कर सकते हैं

मैं अक्सर निम्नलिखित संरचना करते हैं:

 def method(param) case param when String method_for_String(param) when Type1 method_for_Type1(param) ... else #default implementation end end 

यह ऑब्जेक्ट के उपयोगकर्ता को साफ और स्पष्ट विधि_नाम का उपयोग करने की अनुमति देता है: विधि, लेकिन अगर वह निष्पादन को अनुकूलित करना चाहता है, तो वह सीधे सही विधि को कॉल कर सकता है।

साथ ही, यह आपके परीक्षण साफ़ करने वालों और betters बनाता है।