কম্পিউটার

স্লাইসিং এবং ডাইসিং রুবি গণনাযোগ্য

আজ আমরা 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 এবং আপনার অন্যান্য সব প্রিয় গণনাযোগ্য পদ্ধতি. হেক, আপনি এমনকি অন্য বিভক্ত করতে পারেন. :)


  1. পাইথন লিস্ট কম্প্রিহেনশন এবং স্লাইসিং?

  2. RuboCop সহ রুবি কোড লিন্টিং এবং স্বয়ংক্রিয় ফর্ম্যাটিং

  3. কখন ফ্রিজ এবং হিমায়িত ব্যবহার করবেন? রুবিতে

  4. Logger এবং Lograge সঙ্গে রুবি লগ ইন করুন