Enumerable কী?
Enumerable হল ইটারেশন মেথডের একটি সংগ্রহ, একটি রুবি মডিউল, এবং রুবিকে একটি দারুণ প্রোগ্রামিং ল্যাঙ্গুয়েজ बनानेয় একটি বড় অংশ।
Enumerable-এ সহায়ক মেথড রয়েছে:
mapselectinject
Enumerable মেথডগুলো একটি ব্লক দিয়ে কাজ করে।
সেই ব্লকে আপনি বলেন আপনি প্রতিটি এলিমেন্টের সাথে কী করতে চান।
উদাহরণস্বরূপ:
[1,2,3].map { |n| n * 2 }
এটি আপনাকে একটি নতুন অ্যারে দেয় যেখানে প্রতিটি নাম্বার ডাবল হয়ে গেছে।
ঠিক কী হবে সেটি নির্ভর করে আপনি কোন মেথড ব্যবহার করছেন, map সকল ভ্যালু ট্রান্সফর্ম করতে সাহায্য করে, select আপনাকে একটি লিস্ট ফিল্টার করতে দেয় এবং inject একটি অ্যারেতে থাকা সকল ভ্যালু যোগ করতে ব্যবহার করা যায়।
রুবি Enumerable মেথড ২০টিরও বেশি রয়েছে।
চলুন একটি বিস্তারিতভাবে পড়ি।
The Each_Cons মেথড
আমার নতুন প্রিয় Enumerable মেথড হল each_cons!
কারণ:
এই মেথড খুবই উপকারী, আপনি এটিকে n-gram খুঁজে বের করতে বা নাম্বারের একটি সিকোয়েন্স কন্টিগুয়াস কিনা চেক করতে all? (আরেকটি Enumerable মেথড) এর সাথে কম্বাইন করে ব্যবহার করতে পারেন।

each_cons আপনাকে সাইজ n এর সাব-অ্যারে দেয়, তাই যদি আপনার पास [1,2,3] থাকে, তবে each_cons(2) আপনাকে [[1,2], [2,3]] দেবে।
একটি উদাহরণ দেখি:
numbers = [3,5,4,2] numbers.sort.each_cons(2).all? { |x,y| x == y - 1 }
এই কোডটি প্রথমে নাম্বারগুলো সর্ট করে, তারপর each_cons(2) কল করে, যা একটি Enumerator অবজেক্ট রিটার্ন করে, এবং তারপর all? মেথড কল করে চেক করে সব এলিমেন্ট কন্ডিশন মিলিয়ে কিনা।
এখানে আরেকটি উদাহরণ, যেখানে আমি each_cons ব্যবহার করে চেক করছি কোনো ক্যারেক্টার একই ক্যারেক্টার দিয়ে ঘেরা আছে কিনা, যেমন: xyx।
str = 'abcxyx' str.chars.each_cons(3).any? { |a,b,c| a == c }
এরাও আছে!
আপনি যদি জানতে চান এই প্যাটার্নটি কতবার আসে, true/false রেজাল্টের বদলে, তবে আপনি শুধু any? কে count দিয়ে রিপ্লেস করুন।
আমার মতে আরও আকর্ষণীয় হল each_cons মেথডের ইমপ্লিমেন্টেশন।
array = [] each do |element| array << element array.shift if array.size > n yield array.dup if array.size == n end
নোট: এটি Rubinius-এর
Enumerableইমপ্লিমেন্টেশন থেকে এসেছে। আপনি মূল সোর্স কোড এখানে পাবেন।
ইমপ্লিমেন্টেশনটি একটি খালি রুবি অ্যারে দিয়ে শুরু হয়, তারপর each ব্যবহার করে এলিমেন্টগুলোতে ইটারেট করে।
এখানপর্যন্ত সব কিছু স্ট্যান্ডার্ড। কিন্তু তারপর এটি এলিমেন্টটি অ্যারেতে যোগ করে এবং আকার যদি আমাদের চাওয়া সাইজের চেয়ে বড় হয় তবে অ্যারেটি ট্রিম করে (Array#shift ব্যবহার করে)।
সাইজটি হল each_cons-এ পাস করা আর্গুমেন্ট।
তারপর এটি অ্যারের একটি dup yield করে যদি অ্যারের সাইজ রিকোয়েস্ট করা সাইজের সমান হয়।
আমার মতে এটি জিনিস, কারণ এটি আমাদের enumrable অবজেক্টে একটি ‘স্লাইডিং উইন্ডো’ টাইপ ইফেক্ট রাখে, অ্যারে ইনডেক্সের সাথে হাতপা ফুলানোর বদলে।
আরো আকর্ষণীয় মেথডসমূহ
| মেথড | বিবরণ |
|---|---|
| count | নাম অনুযায়ী, ব্লকে true ইভ্যালুয়েট হওয়া জিনিসগুলো কাউন্ট করে |
| group_by | এনumerable এলিমেন্টগুলো ব্লকের রিটার্ন ভ্যালু অনুযায়ী গ্রুপ করে। হ্যাশ রিটার্ন করে |
| partition | দুই গ্রুপে পার্টিশন করে। টু-ডাইমেনশনাল অ্যারে রিটার্ন করে |
| any? | যদি ব্লক যেকোনো এলিমেন্টের জন্য true রিটার্ন করে তবে true রিটার্ন করে |
| all? | যদি ব্লক সকল এলিমেন্টের জন্য true রিটার্ন করে তবে true রিটার্ন করে |
| none? | all?-এর বিপরীত |
| cycle(n) | সকল এলিমেন্ট n বার রিপিট করে, তাই [1,2].cycle(2) করলে আপনি [1,2,1,2] পাবেন |
| find | select-এর মতো, কিন্তু প্রথম যা পায় সেটি রিটার্ন করে |
| inject | পূর্বের ব্লক ভ্যালুর রেজাল্ট একসাথে আনে এবং পরবর্তীতে পাস করে। টোটাল যোগ করতে উপকারী |
| zip | দুটি enumberable অবজেক্টকে একসাথে जोড়ে দেয়, যাতে আপনি সেগুলো পেরালালভাবে কাজ করতে পারেন। এলিমেন্ট কম্পেয়ার এবং হ্যাশ জেনারেট করার জন্য উপকারী |
| map | এনumerable অবজেক্টের প্রতিটি এলিমেন্ট ট্রান্সফর্ম করে এবং নতুন ভার্সন অ্যারে হিসেবে রিটার্ন করে |
সমাপ্তি
আপনি দেখেছেন, Enumerable একটি মডিউল যা মাস্টার করার যোগ্য, তাই ডকুমেন্টেশনে যান এবং দেখুন এটি আপনার জন্য কী করতে পারে!
এই আর্টিকেলটি ভালো লাগলে নিচের ফর্মে শেয়ার এবং সাবস্ক্রাইব করুন। এটি আমার খুব সাহায্য করবে! 🙂