2012-11-30 18 views
7

शीर्षक के लिए खेद है, मुझे नहीं पता कि यह वाक्यविन्यास कैसे कहा जाता है।यह कोड रूबी 1.9 पर क्यों संकलित नहीं है लेकिन रूबी 1.8 पर है?

उदाहरण के लिए:

ary = [ [11, [1]], [22, [2, 2]], [33, [3, 3, 3]] ] 
# want to get [ [11, 1], [22, 2], [33, 3] ] 

रूबी 1,8

ary.map{|x, (y,)| [x, y] } 
#=> [[11, 1], [22, 2], [33, 3]] 

ary.map{|x, (y)| [x, y] } 
#Syntax error, unexpected '|', expecting tCOLON2 or '[' or '.' 
#ary.map{|x, (y)| [x, y] } 
#    ^

रूबी 1,9

ary.map{|x, (y,)| [x, y] } 
#SyntaxError: (irb):95: syntax error, unexpected ')' 
#ary.map{|x, (y,)| [x, y] } 
#    ^

ary.map{|x, (y)| [x, y] } 
#=> [[11, 1], [22, 2], [33, 3]] 

मैं एक तरह से वांछित सरणी प्राप्त करने के लिए नहीं कह रहा हूँ।

मैं जानना चाहता हूं कोड का यह टुकड़ा क्यों काम कर रहा है या तो रूबी के संस्करण में से एक है, लेकिन दोनों नहीं।

उत्तर

5

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

आप रूबी 1.8.7 में एज-केस बग के खिलाफ भी दौड़ने लगते हैं जिसे ठीक किया गया है। सूची विस्तार विधि केवल एक आइटम के साथ काम नहीं लगती है।

इस मामले में एक त्वरित सुधार हो सकता है:

ary.map{|x, (y,_)| [x, y] } 

इस मामले में एक जो कुछ चर के रूप में _ कार्य करता है।

दोनों संस्करणों में आप मिलना चाहिए:

[[11, 1], [22, 2], [33, 3]] 
+0

अनुगामी अल्पविराम 'रूबी 1.8' में की जरूरत थी, तो इसका मतलब यह है वहाँ नियम है कि गायब हो गया किसी तरह का था? – oldergod

+1

मुझे नहीं लगता कि इसकी आवश्यकता बहुत अधिक थी क्योंकि इससे समस्या को हल किया गया था। पूरे ब्लॉक तर्क अर्थशास्त्र को 1.9 में भारी ओवरहाल मिला। डिफ़ॉल्ट और '* args' प्रकार कैच-ऑल के साथ वैकल्पिक तर्क अब समर्थित हैं। यह एक विचित्र व्यवहार है जो एक आइटम के साथ एक सूची की इजाजत नहीं देता है, लेकिन अगर दूसरे वास्तव में नामित किया गया है तो उसे परवाह नहीं किया गया है। – tadman

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