রুবিতে একটি রেঞ্জের সাহায্যে একটি অ্যারেটি স্থাপনের সঠিক উপায়


201

আমি একটি বইয়ের মাধ্যমে কাজ করছি যা রেঞ্জগুলিকে তাদের "to_a" পদ্ধতি ব্যবহার করে সমতুল্য অ্যারে রূপান্তরিত করার উদাহরণ দেয়

আমি যখন আইআরবিতে কোডটি চালাই আমি নিম্নলিখিত সতর্কতাটি পাই

 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]

অথবা to_a ব্যবহার করে

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

1
অ্যারেটি ইতিমধ্যে তৈরি হয়ে থাকলে এবং আপনি এটিতে একটি ব্যাপ্তি যুক্ত করতে চান: আমার আছে order = 1। তারপরে order << (2.25).to_a। তবে এটি অ্যারের ভিতরে আরও একটি অ্যারে তৈরি করে, আমি কেবল 2 থেকে 25 পর্যন্ত রেঞ্জটি চাই Yet তবুও যদি আমি চেষ্টা order << (2.25)করি ত্রুটিটি রেঞ্জকে পূর্ণসংখ্যায় রূপান্তর করতে পারে না।
কাকুবেই

1
এর concatপরিবর্তে @ কাকুবেই ব্যবহার করুন <<। এছাড়াও, আপনার পূর্ণসংখ্যা না হলে "রেঞ্জকে পূর্ণসংখ্যায় রূপান্তর করতে পারে না" order- এমন ক্ষেত্রে আপনাকে বিট-শিফটিং হতে হবে, অ্যারে-অ্যাডিং নয়।
কেলভিন

3
স্প্ল্যাট অপশনটি রুবি ১.৮..7 এর জন্য কাজ করে না, আমি (1..10).to_aপিছনের সামঞ্জস্যের জন্য ব্যবহারের পরামর্শ দেব
কাইলওয়েলসবি

5
আপনার স্প্ল্যাটের ব্যবহারটি অদ্ভুত। আরও ভাল খুঁজছেন বিকল্প [*1..10]
হাউলেথ

2
দ্রুততম উপায় কি ??
আন্দ্রে ইয়াসিনিশিন

79

এটি আমার পক্ষে কাজ করে:

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

সুতরাং সম্ভবত আপনি বন্ধনী অনুপস্থিত?

(আমি রুবি ১.৮.atch প্যাচলেভেল ১১৪ চালাচ্ছি)


7
ব্যাখ্যা : প্রথম বন্ধনী ব্যতীত, আপনি ফিকনাম ক্লাসের উদাহরণ থেকে এই পদ্ধতিতে কল করছেন (এই ক্ষেত্রে 4), ১.৪ পরিসরে নয়। আপনি যদি Fixnum.methods.include?(to_a)রুবি ১.৯.২ এ চালিত হন তবে খেয়াল করবেন যে 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
@ রিচার্ডটার্নার আমি ধরে নিয়েছি আপনি রুবি ১.৮ ব্যবহার করছেন। আমি আশঙ্কা করছি আপনি to_aপ্রথম ফর্মটিতে সতর্কবার্তাটি কী ঘটছে তা ভুল বুঝছেন । এটি কারণ আপনি কল to_aকরছেন self- আপনি আসলে to_aফিকনামের কোনও পদ্ধতি কিনা তা পরীক্ষা করছেন না । to_aনিজেই কল করার চেষ্টা করুন এবং আপনি একই সতর্কতাটি দেখতে পাবেন।
কেলভিন

@ কেলভিন - দুহ! পয়সা ফোঁটা। ধন্যবাদ।
রিচার্ড টার্নার

34

মনে হচ্ছে আপনি এটি করছেন:

0..10.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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.