2009-11-06 18 views
19

मैंने नवीनतम परिवर्तनों के साथ थोड़ा सा खेलने के लिए नवीनतम रूबी संस्करण की जांच की। पहली चीज़ जो मैंने करने की कोशिश की थी वह रूबी लैम्ब्डा/ब्लॉक/प्रो को कॉल करता था जैसे कि आप पाइथन कॉल करने योग्य के साथ करेंगे।रूबी 1.9 लैम्ब्डा कॉल को ब्रांड्स के सामने डॉट के बिना क्यों संभव नहीं है?

a = lambda {|x| puts x} 
a.call(4) # works, and prints 4 
a[4] # works and prints 4 
a.(4) # same 
a(4) # undefined method 'a' for main:Object 

अंतिम कॉल क्यों संभव नहीं है? क्या यह कभी होगा?

उत्तर

10

AFAIK ऐसा इसलिए है क्योंकि रूबी आपको किसी ऑब्जेक्ट के लिए () विधि को परिभाषित नहीं करने देता है। कारण यह आपको () विधि को परिभाषित करने की अनुमति नहीं देता है, संभवतः इस तथ्य के कारण है कि विधि कॉल में ब्रांड्स वैकल्पिक हैं।

और क्या इसके लायक है के लिए, यहाँ आप ()http://github.com/coderrr/parenthesis_hacks/blob/master/lib/lambda.rb

+0

क्या आप कृपया लैम्ब्डा स्क्रिप्ट को थोड़ा सा समझा सकते हैं? – Geo

+0

ठीक है, जब आप 'blah()' और 'method_missing' नामक विधि को आमंत्रित करने का प्रयास करते हैं तो यह ट्रिगर होता है कि यह देखने के लिए जांच करता है कि उचित संदर्भ में' ब्लाडा 'नामक लैम्ब्डा परिभाषित किया गया है या नहीं। यदि ऐसा लैम्ब्डा परिभाषित किया गया है तो यह सामान्य 'blah.call' वाक्यविन्यास का उपयोग करके लैम्ब्डा को आमंत्रित करता है, यह – horseyguy

+0

दिए गए किसी भी पैरामीटर के साथ भी गुजरता है, मुझे लगता है कि यह एक शानदार हैक है। धन्यवाद। – Geo

6

रूबी मूल रूप से 100% ऑब्जेक्ट उन्मुख है, लेकिन कभी-कभी यह इस तथ्य को छिपाने की कोशिश करता है ... सुविधा? अपनेपन?

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

पहले दो उदाहरण ठीक से पार्स करते हैं क्योंकि रुबी जानता है कि आप proc ऑब्जेक्ट के तरीकों तक पहुंचने का प्रयास कर रहे हैं - याद रखें कि [] केवल एक तरीका है जिसे आप परिभाषित कर सकते हैं। स्पष्ट बिंदु वाला एक भी काम करता है क्योंकि डॉट का अर्थ है "इस संदेश को इस संदेश को भेजें" (इस मामले में, a)।

मुझे पता है कि कुछ भी "हल" नहीं करता है, लेकिन मुझे आशा है कि इससे थोड़ा सा मदद मिलेगी।

+1

तथ्य माणिक() 'एक लैम्ब्डा आह्वान करने के लिए OOP की व्याख्या नहीं करता आप क्यों उपयोग नहीं कर सकते है कि' का उपयोग कर lambdas आह्वान जाने के लिए एक हैक है। कई भाषाएं आपको अपनी वस्तुओं के लिए '() 'विधि परिभाषित करने देती हैं। सवाल वास्तव में है क्यों रूबी आपको '()' ऑपरेटर को परिभाषित करने देता है? – horseyguy

+1

(अभी इस टिप्पणी को देखा ...) अच्छा सवाल है। शायद कुछ स्थितियों में आप कोष्ठक को कैसे छोड़ सकते हैं इसके साथ कुछ करने के लिए कुछ है; एक अंतर्निहित अधिभारित ऑपरेटर कॉल होना अजीब होगा। –

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