রুবিতে অবজেক্টের একটি অ্যারে ফিল্টার করতে আপনি select মেথড ব্যবহার করতে পারেন।
উদাহরণস্বরূপ, আপনি একটি লিস্ট থেকে সব জোড় সংখ্যা খুঁজে পেতে পারেন।
select ছাড়া এটি এমন দেখাবে:
even_numbers = [] [1,2,3,4,5,6].each do |n| if n.even? even_numbers << n end end even_numbers
এতটো সহজ কাজের জন্য এটি довольно বেশি কোড!
চলুন select কীভাবে ব্যবহার করবেন তা শিখি।
Select মেথড উদাহরণ
select ব্যবহার করতে একটি ব্লক প্রয়োজন।
ব্লকের ভিতরে আপনাকে এমন কিছু রিটার্ন করতে হবে যা true বা false এvaluate হয়, এবং select আপনার অ্যারে ফিল্টার করতে তা ব্যবহার করবে।
রুবিতে বুলিয়ান মান সম্পর্কে জানতে এই আর্টিকেলটি পড়ুন।
এখানে একটি উদাহরণ:
[1,2,3,4,5,6].select { |n| n.even? }
এটি প্রথম উদাহরণের মতোই কাজ করবে, কিন্তু অনেক কম কোডে।
বস্তুতঃ আমরা এটাকে আরও ছোট করতে পারি।
এভাবে:
[1,2,3,4,5,6].select(&:even?)
এই শর্টকাটটি শুধু তখন কাজ করে যখন আপনাকে অ্যারেতে প্রতিটি এলিমেন্টে সরাসরি একটি মেথড কল করতে হয়।
ব্রাম্ভে, আপনি হ্যাশের সাথে select ব্যবহার করতে পারেন।
উদাহরণ:
stock = { apples: 10, oranges: 5, bananas: 1 } stock.select { |k, v| v > 1 } # {:apples=>10, :oranges=>5}
এখানে k কী রিপ্রেজেন্ট করে এবং v মানগুলো রিপ্রেজেন্ট করে।
আমি বলছি:
"আমাকে ১-এর চেয়ে বেশি স্টকযুক্ত সব ফলগুলো দাও।"
অন্যান্য মেথডের সাথে Select কম্বাইন করা
আপনি select মেথডকে অন্য Enumerable মেথডের সাথে কম্বাইন করতে পারেন।
সबচেয়ে उল্লেখ্য with_index।
উদাহরণ:
fruits = %w(apple orange banana) fruits.select.with_index { |word, idx| idx.even? } # ["apple", "banana"]
এটি আপনাকে অবজেক্টের বদলে ইন্ডেক্স ব্যবহার করে ফিল্টার করতে দেয় (এই ক্ষেত্রে একটি স্ট্রিং)।
ইন-প্লেস অ্যারে ফিল্টারিং
অ্যারেতে select ব্যবহার করলে সবসময় একটি নতুন অ্যারে তৈরি হয়।
যদি আপনি মূল অ্যারেটি পরিবর্তন করতে চান, তবে select! মেথড ব্যবহার করতে পারেন।
এখানে কীভাবে:
fruits = %w(apple orange banana) fruits.select! { |fruit| fruit.start_with? "a" } # ["apple"]
এক্সক্লামেশন মার্ক (\(!\)) দিয়ে শেষ হওয়া মেথডগুলো (যেমন select!) নতুন একটা রিটার্ন করার বদলে অবজেক্টকেই পরিবর্তন করে, কিন্তু এই নিয়মটি ল্যাঙ্গুয়েজ নিজে এনফোর্স করে না।
এটি শুধু প্রোগ্রামারদের মধ্যে একটি কনভেনশন।
Find বনাম Select
যখন আপনি একটি লিস্ট ফিল্টার করে রেজাল্টসহ একটি অ্যারে পেতে চান, তখন Select দুর্দান্ত।
কিন্তু যদি আপনি শুধু একটি অবজেক্ট খুঁজতে চান?
তখন আপনি find মেথড ব্যবহার করতে পারেন।
এভাবে:
letters = %w(a aa aaa aaaa) letters.find { |l| l.size == 3 } # "aaa" letters.find { |l| l.size == 10 } # nil
find আপনাকে প্রথম ম্যাচটি দেয়, বা ম্যাচ না পেলে nil রিটার্ন করে।
Find All মেথড বুঝতে
যদি আপনি find_all মেথড সম্পর্কে জানতে চান এবং এটি find ও select এর সাথে কীভাবে সম্পর্কিত...
এটি খুব সহজ!
find_allমেথড হলোselectএর একটি এলিয়াস।findমেথড আপনাকে অনেক অবজেক্টের বদলে একটি নির্দিষ্ট অবজেক্ট খুঁজতে সাহায্য করে।
রুবি ২.৬ select এর জন্য আরেকটি এলিয়াস যোগ করেছে:
filter
Select-এর বিপরীত কী?
আপনি যা চান না সেগুলো সিলেক্ট করার বদলে রিমুভ করতে পারেন।
Select দিয়ে এটি সহজ:
[1,2,3,4,5,6].select { |n| n != 4 }
কিন্তু একটি মেথড আছে যা বিষয়টি আরও স্পষ্ট করে।
সেটি হলো reject।
উদাহরণ:
[1,2,3,4,5,6].reject { |n| n == 4 }
পারফরম্যান্স বা অন্য কোনো দিক থেকে আপনাকে কোনো টেকনিক্যাল সুবিধা নয়, কিন্তু এটি আপনার কোডকে আরও ভালো করবে।
রেইলস Select মেথড
আমি চাই না আপনি রেইলস মডেলের সাথে কাজ করার সময় select দেখে বিভ্রান্ত হন।
আপনার জানা উচিত যে...
এই select মেথডটি ভিন্ন!
উদাহরণ:
Fruit.select(:id, :name, :color)
যখন আপনি ActiveRecord মডেলের সাথে select ব্যবহার করেন, আপনি ডাটাবেস থেকে নির্দিষ্ট কলাম চাইছেন।
যémy বুঝতে পারলাম এটি মূলত পারফরম্যান্সের কারণেই করা হয়।
এখানেই শেষ নয়:
যদি আপনি রেইলস অ্যাপের ভিতরে একটি রেগুলার অ্যারে নিয়ে কাজ করেন, তবে আপনি এই পুরো আর্টিকেলে যে select মেথড সম্পর্কে আলোচনা করা হয়েছে, সেটি ব্যবহার করছেন।
সারসংক্ষেপ
আপনি রুবির সবচেয়ে হেল্পফুল মেথডগুলোর একটা select সম্পর্কে শিখেছেন, যা অ্যারে, রেঞ্জ ও হ্যাশের মতো অবজেক্টের কালেকশনের সাথে কাজ করতে সাহায্য করে।

এখন আপনার পালা, আপনার এডিটর খুলুন এবং এটি ব্যবহার করুন।
পড়ার জন্য ধন্যবাদ!