रूबी में एक रेंज के साथ एक सरणी को आबाद करने का सही तरीका


201

मैं एक पुस्तक के माध्यम से काम कर रहा हूं, जो अपने "to_a" तरीकों का उपयोग करते हुए Ranges के समकक्ष सरणियों में परिवर्तित होने का उदाहरण देती है

जब मैं irb में कोड चलाता हूं तो मुझे निम्नलिखित चेतावनी मिलती है

 warning: default `to_a' will be obsolete

To_a का उपयोग करने का सही विकल्प क्या है?

एक श्रेणी के साथ एक सरणी को आबाद करने के लिए वैकल्पिक तरीके हैं?


7
किसी श्रेणी को एक सरणी में परिवर्तित करने के लिए बड़ा कैवेट, एक बड़ी सीमा है जब सरणी का निर्माण किया जाता है, तो बहुत सारी मेमोरी का उपभोग कर सकते हैं, इसलिए इसका उपयोग सावधानी से करें। सरणी बनाने के बजाय, यह सीमा से अधिक पुनरावृत्त करना बेहतर हो सकता है जैसे कि आप मेमोरी खपत को कम रखने के लिए एक सरणी होगा। यह उन लोगों में से एक है जो "आवश्यक रूप से लागू होते हैं" चीजें।
टिन मैन

जवाबों:


357

आप एक श्रेणी बना सकते हैं जिसमें स्पैट का उपयोग करके,

>> a=*(1..10)
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Kernel Arrayविधि का उपयोग,

Array (1..10)
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

या_का उपयोग करके

(1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

1
क्या होगा यदि सरणी पहले से ही बनाई गई है और आप इसमें एक सीमा जोड़ना चाहते हैं: मेरे पास है order = 1। तब order << (2.25).to_a। लेकिन यह सरणी के अंदर एक और सरणी बनाता है, मैं बस 2 से 25 तक की सीमा चाहता हूं। फिर भी अगर मैं कोशिश करता order << (2.25)हूं कि मुझे त्रुटि मिले तो रेंज को इंटेगर में परिवर्तित नहीं किया जा सकता है।
काकूबाई

1
@kakubei के concatबजाय का उपयोग करें <<। इसके अलावा, आपको "पूर्ण रूप से श्रेणी को पूर्णांक में परिवर्तित नहीं किया जा सकता है" जब तक orderकि पूर्णांक नहीं है - जिस स्थिति में आप बिट-शिफ्टिंग करेंगे, सरणी-एपेंडिंग नहीं।
केल्विन

3
स्प्लैट विकल्प रूबी 1.8.7 के लिए काम नहीं करता है, मैं (1..10).to_aपीछे की संगतता के लिए उपयोग करने की सिफारिश
करूंगा

5
आपके छींटे का उपयोग बुरा है। बेहतर दिखने वाला विकल्प है [*1..10]
होलेथ

2
सबसे तेज़ तरीका क्या है ??
एंड्री यासिनिशिन

79

यह मेरे लिए irb में काम करता है:

irb> (1..4).to_a
=> [1, 2, 3, 4]

मुझे लगता है कि:

irb> 1..4.to_a
(irb):1: warning: default `to_a' will be obsolete
ArgumentError: bad value for range
        from (irb):1

तो शायद आप कोष्ठक याद आ रहे हैं?

(मैं रूबी 1.8.6 पैचवेल 114 चला रहा हूं)


7
स्पष्टीकरण : कोष्ठक के बिना, आप फिक्सडम वर्ग के एक उदाहरण से to_a विधि को बुला रहे हैं (इस मामले में 4), सीमा 1..4 पर नहीं। अगर आप Fixnum.methods.include?(to_a)माणिक 1.9.2 में भाग लेते हैं , तो आप देखेंगे कि to_a विधि अब परिभाषित नहीं है, इसलिए आपको 08 में यह मूल्यह्रास संदेश मिल रहा है
पियरे

@ मुझे लगता है कि आपका मतलब हैFixnum.instance_methods.include?(:to_a)
केल्विन

@ केल्विन - वास्तव में, methods.include?अधिक जानकारीपूर्ण है: $ irb irb(main):001:0> Fixnum.methods.include?(to_a) (irb):1: warning: default to_a 'अप्रचलित हो जाएगा=> false irb(main):002:0> Fixnum.instance_methods.include?(:to_a) => false
रिचर्ड टर्नर

1
@ रिचार्डटर्नर मेरा मानना ​​है कि आप रूबी 1.8 का उपयोग कर रहे हैं। मुझे डर है कि आप गलत समझ रहे हैं to_aकि पहले रूप में चेतावनी क्या शुरू कर रही है। यह क्योंकि आप कॉल कर रहे है to_aपर self- आप वास्तव में जाँच नहीं कर रहे हैं कि क्या to_aFixnum की एक विधि है। अपने आप से कॉल करने का प्रयास करें to_aऔर आप एक ही चेतावनी देखेंगे।
केल्विन

@ केल्विन - दुह! पैसा गिरता है। धन्यवाद।
रिचर्ड टर्नर

34

लगता है कि आप ऐसा कर रहे हैं:

0..10.to_a

चेतावनी Fixnum # to_a से है, रेंज # to_a से नहीं। इसके बजाय यह प्रयास करें:

(0..10).to_a



4

मैंने सिर्फ बड़ी से लेकर छोटी राशि तक की रेंज का उपयोग करने की कोशिश की और मुझे वह परिणाम मिला जिसकी मुझे उम्मीद नहीं थी:

irb(main):007:0> Array(1..5)
=> [1, 2, 3, 4, 5]
irb(main):008:0> Array(5..1)
=> []

इसकी वजह रेंज इंप्लीमेंटेशन है।
इसलिए मुझे निम्नलिखित विकल्प का उपयोग करना पड़ा:

(1..5).to_a.reverse

4
आज मुझे पता चला है 5.downto(1).to_aजो एक घटती हुई रेंज stackoverflow.com/a/8927009/703903
odlp
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.