2012-03-14 19 views
5

मैं अपने कोड भर हैश के लिए {key: 'value'} सिंटैक्स का उपयोग एक रूबी मणि लिख रहा हूँ रूबी 1.9 के हैश वाक्य रचना का समर्थन। मेरे परीक्षण सभी 1.9.एक्स में गुजरते हैं, लेकिन मैं (समझ में) syntax error, unexpected ':', expecting ')' 1.8.7 में प्राप्त करता हूं।रूबी 1.8 में

क्या 1.8.x का समर्थन करने के लिए कोई अच्छा अभ्यास है? क्या मुझे अपने पुराने दोस्त => का उपयोग करके कोड को फिर से लिखना होगा, या क्या कोई बेहतर रणनीति है?

+1

रूबी 1.8 जल्द ही खत्म हो जाएगा। आपको इसके लिए समर्थन की आवश्यकता नहीं है। – sawa

+3

क्या यह एक लोकप्रिय राय है? मैं निश्चित रूप से अन्य जेम लेखकों के इनपुट पर इनपुट की तलाश में हूं। मुझे पता है कि रुबी समुदाय के भीतर 1.9 ट्रेन पर सभी को पाने के लिए एक बड़ा धक्का है। मैं व्यक्तिगत रूप से 1.8 पीछे छोड़ने पर बुरा नहीं मानता। – JackCA

उत्तर

16

मुझे लगता है कि आप भाग्य से बाहर हो, तो आप 1.8 का समर्थन करने के आप => उपयोग करने के लिए चाहते हैं। सामान्य रूप से, मैं उल्लेख करूंगा कि आपको 1.9:

  1. यदि कोई प्रतीक प्रतीक नहीं है तो आपको => का उपयोग करना होगा। याद रखें कि किसी ऑब्जेक्ट (प्रतीक, तार, कक्षाएं, फ्लोट्स, ...) रूबी हैश में एक कुंजी हो सकती है।
  2. यदि आपको एक प्रतीक की आवश्यकता है जिसे आप उद्धृत करेंगे: :'this.that'
  3. आप काफी कुछ भी के लिए MongoDB का उपयोग करते हैं आप :$set => hash लेकिन $set: hash जैसी चीजों का उपयोग किया जाएगा एक सिंटैक्स त्रुटि है।

हमारे नियमित रूप से निर्धारित प्रोग्रामिंग करने के लिए वापस।

मैं क्यों कहता हूं कि आप भाग्य से बाहर हैं? हैश शाब्दिक वाक्यविन्यास (उनमें से दोनों) पार्सर में कड़ी मेहनत कर रहे हैं और मुझे नहीं लगता कि आपको अपने मणि से पार्सर को पैच करने में बहुत भाग्य होगा। Ruby 1.8.7's parse.y इस में क्या कहना है:

assoc : arg_value tASSOC arg_value 
      { 
       $$ = list_append(NEW_LIST($1), $3); 
      } 
     ; 

और tASSOC है => तो हैश शाब्दिक कठिन वायर्ड => उपयोग करने के लिए कर रहे हैं। 1.9.3's इस कहते हैं:

assoc : arg_value tASSOC arg_value 
      { 
      /*%%%*/ 
       $$ = list_append(NEW_LIST($1), $3); 
      /*% 
       $$ = dispatch2(assoc_new, $1, $3); 
      %*/ 
      } 
     | tLABEL arg_value 
      { 
      /*%%%*/ 
       $$ = list_append(NEW_LIST(NEW_LIT(ID2SYM($1))), $2); 
      /*% 
       $$ = dispatch2(assoc_new, $1, $2); 
      %*/ 
      } 
     ; 

हम वसा-तीर वाक्य रचना फिर से (arg_value tASSOC arg_value) और जावास्क्रिप्ट शैली (tLABEL arg_value) है; AFAIK, tLABEL भी प्रतिबंध प्रतीकों में से किस तरह के (कोई :$set, कोई :'this.that', ...) पर JavaScript शैली वाक्य रचना के साथ इस्तेमाल किया जा सकता का स्रोत है। वर्तमान ट्रंक parse.y हैश अक्षर के लिए 1.9.3 से मेल खाता है।

तो हैश शाब्दिक वाक्य रचना पार्सर में कठिन वायर्ड है और आप वसा तीर के साथ फंस रहे हैं आप 1.8 का समर्थन करना चाहते हैं।

+0

बहुत अच्छा और गहन जवाब, एमयू। ऐसा लगता है कि मुझे उन उदाहरणों को फिर से लिखना पड़ सकता है जहां मैं जेएस स्टाइल सिंटैक्स का उपयोग करता हूं। बस विरासत कोड लिखने के बिना विरासत संस्करणों का समर्थन करने का एक तरीका था। यद्यपि यह सबसे अच्छा शर्त हो सकता है। – JackCA

1

रूबी 1.8.7 नए हैश वाक्यविन्यास का समर्थन नहीं करता है।

आप सख्त रूबी के गैर YARV ग आधारित कार्यान्वयन पर हैश वाक्य रचना की जरूरत है, वहाँ एक पूरी तरह से असमर्थित 1.8 सिर शाखा है, तो आप

rvm install ruby-head --branch ruby_1_8 ; rvm ruby-head 
ruby -v 
ruby 1.8.8dev (2011-05-25) [i386-darwin10.7.0] 

लेकिन 1.9 के उन्नयन करना can के लिए रास्ता है चले जाओ।

+0

मुझे लगता है कि जैकसीए का इरादा एक रत्न प्रदान करना है जो रूबी 1 है।8 उपयोगकर्ता इसका उपयोग कर सकते हैं, न कि जैकसीए रूबी 1.8 का उपयोग कर रहा है। तो मुझे नहीं लगता कि इससे मदद मिलेगी। – sawa

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