2010-05-02 9 views
7

निम्न कोड स्निपेट मैक ओएस एक्स पर 1.8.7 में ठीक काम करता है, लेकिन उबंटू पर 1.8.6 में नहीं। क्यूं कर? क्या आसपास कोई काम है?6.times.map ruby ​​1.8.7 में क्यों काम करता है लेकिन 1.8.6

1.8.7 में काम करता है:

$ ruby --version 
ruby 1.8.7 (2009-06-08 patchlevel 173) [universal-darwin10.0] 
ltredgate15:eegl leem$ irb 
>> 6.times.map {'foo'} 
=> ["foo", "foo", "foo", "foo", "foo", "foo"] 
>> 

लेकिन नहीं 1.8.6 में:

# ruby --version 
ruby 1.8.6 (2008-08-11 patchlevel 287) [i686-linux] 
Ruby Enterprise Edition 20090610 
# irb 
irb(main):001:0> 6.times.map {'foo'} 
LocalJumpError: no block given 
     from (irb):1:in `times' 
     from (irb):1 
irb(main):002:0> 

क्यों एक अंतर है? 1.8.6 के लिए कामकाज क्या है?

उत्तर

16

1.8.7+ में times जैसे पुनरावर्तक विधियों को एक अंक के बिना बुलाए जाने पर एक गणनाकर्ता लौटाएं। 1.8.6 में आप

require 'enumerator' 
6.enum_for(:times).map {...} 

या इस विशिष्ट उपयोग के लिए क्या करना है तो आप बस, यह देखते हुए खंड पर (0...6).map {...}

+2

या 'बैकपोर्ट' की आवश्यकता है ... –

+0

अब आपको केवल आवश्यक बैकपोर्ट की आवश्यकता हो सकती है। इस मामले में ... पृष्ठभूमि की जानकारी के लिए धन्यवाद 'बैकपोर्ट/1.8.7/पूर्णांक/समय' –

1

1.8.6 क्योंकि #times पैदावार कर सकता है, जबकि 1.8.7 एक गणनाकार ऑब्जेक्ट आप समेकित रख सकते हैं और लागू कर सकते हैं।

6

रूबी 1.9 में, लाइब्रेरी बदल दी गई थी, इसलिए पुनरावृत्त करने वाले कार्यों को एक संख्या के बिना बुलाए जाने पर एक गणनाकर्ता वस्तु वापस कर दी जाएगी। अन्य भाषा सुविधाओं का एक पूरा मेजबान भी बदल दिया गया था, और यह व्यापक रूप से ज्ञात था कि पूरी तरह से भाषा में सुधार के हित में रूबी 1.8.एक्स और रूबी 1.9 के बीच संगतता टूट जाएगी। ज्यादातर लोगों को यह बहुत परेशान नहीं मिला।

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

यह माइग्रेशन सुविधा है जिसे आप 1.8.7 में देख रहे हैं, जो 1.8.6 में मौजूद नहीं है।

sepp2k का उत्तर एक अच्छा कामकाज देता है। उस गिनती को जोड़ने के लिए मेरे लिए बहुत कुछ नहीं है।

+0

धन्यवाद, वास्तव में जानना अच्छा है। – Lee

+0

मैं जोड़ता हूं कि 1.8.7 अधिकतर संगत है (और जब यह नहीं है, 1.9 नहीं होगा)। इस प्रश्न को जांचें http://stackoverflow.com/questions/2544185/upgrade-ruby-projects-from-1-8-6-to-1-8-7/2545416#2545416 –

1

रूबी 1.8.7 many changes प्रस्तुत करता है। यदि आप रूबी 1.8.6 में उनका उपयोग करना चाहते हैं, तो बस

require 'backports' 

यही है। यह आपको 1.9.1 और आने वाले 1.9.2 के कई तरीकों को भी देता है, हालांकि 1.8.7 के परिवर्तनों के लिए require 'backports/1.8.7' या यहां तक ​​कि केवल आपको आवश्यक बैकपोर्ट्स के लिए संभव है। require 'backports/1.8.7/integer/times'

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