আমি বলছি না Array
-> |value,index|
এবং Hash
-> |key,value|
উন্মাদ নয় (হোরেস লয়েবের মন্তব্য দেখুন), তবে আমি বলছি যে এই ব্যবস্থাটি প্রত্যাশা করার একটি বুদ্ধিমান উপায় আছে।
যখন আমি অ্যারেগুলি নিয়ে কাজ করি, তখন আমি অ্যারের উপাদানগুলিতে মনোনিবেশ করি (সূচকটি ট্রানজিস্ট্রি হওয়ায় সূচকে নয়)। পদ্ধতিটি প্রতিটি সূচক সহ প্রতিটি, অর্থাৎ প্রতিটি + সূচক, বা | প্রতিটি, সূচক |, বা|value,index|
। এটি সূচকটিকে alচ্ছিক যুক্তি হিসাবে দেখা হচ্ছে, যেমন: মান value | মান, সূচক = শূন্যের সমতুল্য যা | মান, সূচক | এর সাথে সামঞ্জস্যপূর্ণ।
আমি যখন হ্যাশগুলি নিয়ে কাজ করি তখন আমি প্রায়শই মানগুলির চেয়ে কীগুলিতে বেশি মনোনিবেশ করি এবং আমি সাধারণত key => value
বা সেই সাথে এই ক্রমে কীগুলি এবং মানগুলি নিয়ে কাজ করছি hash[key] = value
।
আপনি যদি হাঁস-টাইপিং করতে চান, তবে ব্রেন্ট লংবোরো যেভাবে দেখিয়েছেন তা স্পষ্টভাবে একটি সংজ্ঞায়িত পদ্ধতি ব্যবহার করুন বা ম্যাকহাকিন্সের মতো একটি অন্তর্নিহিত পদ্ধতি ব্যবহার করুন।
রুবি প্রোগ্রামার অনুসারে ভাষা সংযোজন করার বিষয়ে, ভাষা অনুসারে প্রোগ্রামারকে সংযুক্ত করার বিষয়ে নয়। এই কারণেই অনেকগুলি উপায় রয়েছে। কিছু চিন্তা করার অনেক উপায় আছে। রুবিতে, আপনি সবচেয়ে কাছেরটি চয়ন করেন এবং বাকী কোডটি সাধারণত খুব ঝরঝরে এবং সংক্ষিপ্তভাবে আসে।
মূল প্রশ্ন হিসাবে, "রুবিতে অ্যারের মাধ্যমে পুনরাবৃত্তি করার" সঠিক "উপায়টি কী?", ভাল, আমি মনে করি মূল উপায়টি (অর্থাত্ শক্তিশালী সিনট্যাকটিক চিনি বা বস্তু কেন্দ্রিক শক্তি ছাড়াই) করণীয়:
for index in 0 ... array.size
puts "array[#{index}] = #{array[index].inspect}"
end
তবে রুবি শক্তিশালী সিনট্যাকটিক চিনি এবং অবজেক্ট ওরিয়েন্টেড পাওয়ার সম্পর্কে, তবে যাইহোক এখানে হ্যাশগুলির সমতুল্য, এবং কীগুলি অর্ডার করা যায় বা না:
for key in hash.keys.sort
puts "hash[#{key.inspect}] = #{hash[key].inspect}"
end
সুতরাং, আমার উত্তরটি হ'ল, "রুবিতে একটি অ্যারের মাধ্যমে পুনরাবৃত্তি করার" সঠিক "উপায়টি আপনার উপর নির্ভর করে (যেমন প্রোগ্রামার বা প্রোগ্রামিং টিম) এবং প্রকল্প" রুবি আরও ভাল প্রোগ্রামার আরও ভাল পছন্দ করে (যার মধ্যে সিনট্যাক্টিক শক্তি এবং / অথবা কোন বস্তু ভিত্তিক দৃষ্টিভঙ্গি)। আরও ভাল রুবি প্রোগ্রামার আরও উপায় সন্ধান করতে থাকে।
এখন, আমি আরেকটি প্রশ্ন জিজ্ঞাসা করতে চাই, "রুবি পিছনের দিকে একটি রেঞ্জের মধ্য দিয়ে পুনরাবৃত্তি করার" ডান "উপায় কী?"! (এই প্রশ্নটি আমি কীভাবে এই পৃষ্ঠায় এসেছি))
এটি করা ভাল (সামনের দিকে):
(1..10).each{|i| puts "i=#{i}" }
তবে আমি (পিছনের দিকে) করতে পছন্দ করি না:
(1..10).to_a.reverse.each{|i| puts "i=#{i}" }
ঠিক আছে, আমি আসলে এটি খুব বেশি কিছু করতে আপত্তি করি না, তবে আমি যখন পিছনের দিকে যেতে শিখছি তখন আমি আমার ছাত্রদের একটি দুর্দান্ত প্রতিসাম্য প্রদর্শন করতে চাই (অর্থাত্ ন্যূনতম পার্থক্য সহ, যেমন কেবল একটি বিপরীত বা একটি ধাপ -1 যোগ করা, তবে ছাড়া) অন্য কিছু পরিবর্তন করে)। আপনি (প্রতিসাম্য জন্য) করতে পারেন:
(a=*1..10).each{|i| puts "i=#{i}" }
এবং
(a=*1..10).reverse.each{|i| puts "i=#{i}" }
যা আমি বেশি পছন্দ করি না, তবে আপনি করতে পারবেন না
(*1..10).each{|i| puts "i=#{i}" }
(*1..10).reverse.each{|i| puts "i=#{i}" }
#
(1..10).step(1){|i| puts "i=#{i}" }
(1..10).step(-1){|i| puts "i=#{i}" }
#
(1..10).each{|i| puts "i=#{i}" }
(10..1).each{|i| puts "i=#{i}" } # I don't want this though. It's dangerous
আপনি শেষ পর্যন্ত করতে পারে
class Range
def each_reverse(&block)
self.to_a.reverse.each(&block)
end
end
তবে আমি অবজেক্ট ওরিয়েন্টেড পদ্ধতির পরিবর্তে খাঁটি রুবিকে শিখতে চাই (ঠিক এখনও)। আমি পিছনে পুনরাবৃত্তি করতে চাই:
- একটি অ্যারে তৈরি না করে (0..1000000000 বিবেচনা করুন)
- যে কোনও রেঞ্জের জন্য কাজ করা (উদাহরণস্বরূপ স্ট্রিংস, শুধুমাত্র পূর্ণসংখ্যার নয়)
- কোনও অতিরিক্ত অবজেক্ট ভিত্তিক শক্তি ব্যবহার না করে (অর্থাত্ কোনও শ্রেণি পরিবর্তন নয়)
আমি বিশ্বাস করি কোনও pred
পদ্ধতি সংজ্ঞা না দিয়ে এটি অসম্ভব , যার অর্থ এটি ব্যাপ্তি শ্রেণিটি ব্যবহারের জন্য পরিবর্তন করা। আপনি যদি এটি করতে পারেন দয়া করে আমাকে জানান, অন্যথায় অসম্ভবতার নিশ্চিতকরণ প্রশংসিত হবে যদিও এটি হতাশ হবে। সম্ভবত রুবি 1.9 এটি সম্বোধন করে।
(এটি পড়ার জন্য আপনার সময়ের জন্য ধন্যবাদ।)
array#each_with_index
ব্যবহারগুলি অনুমান করি|value, key|
কারণ পদ্ধতির নামটি অর্ডারকে বোঝায়, যেখানেhash#each
ক্রমটিhash[key] = value
সিনট্যাক্সের অনুকরণের জন্য ব্যবহৃত হয়েছে ?