আজ আমরা slice_before
সম্পর্কে কথা বলতে যাচ্ছি , slice_when
এবং slice_after
. এগুলি হল অতি-উপযোগী পদ্ধতি যখন আপনি একটি অ্যারে বা অন্য গণনাযোগ্য আইটেমগুলিকে নির্বিচারে মানদণ্ডের উপর ভিত্তি করে গ্রুপ করতে হবে।
আপনি সম্ভবত Array#slice
এর সাথে পরিচিত . এটি আপনাকে সূচকের পরিসরের উপর ভিত্তি করে একটি অ্যারের একটি উপসেট বের করতে দেয়:
a = ["a", "b", "c"]
a.slice(1, 2)
# => ["b", "c"]
এটি দরকারী, কিন্তু এটি গণনাযোগ্যগুলির সাথে ব্যবহার করা যাবে না, কারণ গণনাযোগ্যগুলির সূচক নেই।
slice_before
, slice_when
এবং slice_after
পদ্ধতিগুলি সূচকের উপর নির্ভর করে না - তাই আপনি যেকোন গণনার সাথে সেগুলি ব্যবহার করতে পারেন। চলুন দেখে নেওয়া যাক!
Enumerable#slice_before
ব্যবহার করা
Enumerable#slice_before
একটি ম্যাচ তৈরি হওয়ার আগে পয়েন্টে বিভক্ত এবং দলে গণনাযোগ্য।
ম্যাচটি ===
এর মাধ্যমে করা হয় অপারেটর, যার মানে হল যে আপনি সব ধরণের জিনিস মেলে।
মান মিল
আপনি একটি একক মান মেলাতে পারেন. যে সুস্পষ্ট হওয়া উচিত. :)
a = ["a", "b", "c"]
a.slice_before("b").to_a
# => [["a"], ["b", "c"]]
রেগুলার এক্সপ্রেশন ম্যাচ
আপনি আরও জটিল পাঠ্য মিলের জন্য নিয়মিত অভিব্যক্তি ব্যবহার করতে পারেন।
a = ["000", "b", "999"]
a.slice_before(/[a-z]/).to_a
# => [["000"], ["b", "999"]]
রেঞ্জ ম্যাচ
আপনি যদি সংখ্যা নিয়ে কাজ করেন তবে আপনি একটি পরিসরের উপর ভিত্তি করে অ্যারেটি স্লাইস করতে পারেন।
a = [100, 200, 300]
a.slice_before(150..250).to_a
# => [[100], [200, 300]]
ক্লাস ম্যাচ
এটি আপনার কাছে কিছুটা অদ্ভুত মনে হতে পারে, তবে এটি সম্পূর্ণরূপে ===
এর আচরণের সাথে সামঞ্জস্যপূর্ণ অপারেটর.
a = [1, "200", 1.3]
a.slice_before(String).to_a
# => [[1], ["200", 1.3]]
একটি ব্লক ব্যবহার করা
৷যদি অন্য কোনো বিকল্পই যথেষ্ট নমনীয় না হয় তবে আপনি সবসময় একটি ব্লকের সাথে প্রোগ্রাম্যাটিকভাবে একটি মিল খুঁজে পেতে পারেন।
a = [1, 2, 3, 4, 5]
a.slice_before do |item|
item % 2 == 0
end
# => [[1], [2, 3], [4, 5]]
Enumerable#slice_after
ব্যবহার করা
Enumerable#slice_after
ঠিক Enumerable#slice_before
এর মত কাজ করে স্লাইস ম্যাচের পরে ঘটে তা ছাড়া। চিত্রে যান. :-)
a = ["a", "b", "c"]
a.slice_after("b").to_a
# => [["a", "b"], ["c"]]
অবশ্যই, আপনি রেগুলার এক্সপ্রেশন, রেঞ্জ এবং ব্লক ব্যবহার করে মেলাতে পারেন। আমি এখানে সেগুলির উদাহরণ দেখাতে যাচ্ছি না কারণ এটি ক্লান্তিকর হবে৷
৷ Enumerable#slice_when
ব্যবহার করা
Enumerable#slice_when
slice_before
থেকে একটি ভিন্ন জন্তু৷ এবং slice_after
. অ্যারেতে একটি একক আইটেম মেলানোর পরিবর্তে, আপনি সংলগ্ন আইটেমগুলির একটি জোড়া মেলে৷
এর মানে হল যে আপনি তাদের মধ্যে "প্রান্ত" এর উপর ভিত্তি করে আইটেমগুলিকে গ্রুপ করতে পারেন৷
উদাহরণস্বরূপ, এখানে আমরা তাদের সন্নিহিত আইটেমগুলির "সান্নিধ্য" এর উপর ভিত্তি করে আইটেমগুলিকে গোষ্ঠীবদ্ধ করি।
a = [1, 2, 3, 100, 101, 102]
# Create a new group when the difference
# between two adjacent items is > 10.
a.slice_when do |x, y|
(y - x) > 10
end
# => [[1, 2, 3], [100, 101, 102]]
আপনি যদি আরও জানতে আগ্রহী হন, তাহলে slice_when
এর জন্য রুবি ডক্স দেখুন . তাদের বেশ কয়েকটি দুর্দান্ত কোড উদাহরণ রয়েছে।
অ্যারে বনাম গণনাযোগ্য
আমি উপরের বেশিরভাগ উদাহরণে অ্যারে ব্যবহার করেছি কারণ অ্যারে বোঝা সহজ। আপনার মনে রাখা উচিত যে আপনি slice_before
ব্যবহার করতে পারেন , slice_when
এবং slice_after
যেকোন গননার সাথে।
উদাহরণস্বরূপ, যদি আপনার কাছে একগুচ্ছ ইমেল সম্বলিত একটি ফাইল থাকে, তাহলে আপনি slice_before
ব্যবহার করে পৃথক ইমেলগুলিকে বিভক্ত করতে পারেন . নিচের কোডটি ডক্স থেকে নেওয়া হয়েছে।
open("mbox") { |f|
f.slice_before { |line|
line.start_with? "From "
}.each { |mail|
puts mail
}
এবং লক্ষ্য করুন যে স্লাইস পদ্ধতিগুলি অ্যারে ফেরত দেয় না। তারা গণনা ফেরত দেয়। তার মানে আপনি map
ব্যবহার করতে পারেন , each
এবং আপনার অন্যান্য সব প্রিয় গণনাযোগ্য পদ্ধতি. হেক, আপনি এমনকি অন্য বিভক্ত করতে পারেন. :)