আপনি যখন আপনার সংগ্রহগুলিকে গণনাকারী হিসাবে বিবেচনা করেন, তখন আপনি কোনও অতিরিক্ত কোড না লিখেই আপনার পছন্দের সমস্ত ফাংশন যেমন #map এবং #reduce ব্যবহার করতে পারবেন। এটা বেশ অসাধারণ।
পুরানো দিনে, গণনাকারীকে সংজ্ঞায়িত করা একটু কষ্টকর ছিল। আপনাকে একটি নতুন ক্লাস তৈরি করতে হবে, গণনাযোগ্য মডিউল অন্তর্ভুক্ত করতে হবে এবং একটি #প্রতিটি ফাংশন সংজ্ঞায়িত করতে হবে।
যদিও রুবি 1.9 এর পর থেকে, আমাদের কাছে ফ্লাইতে গণনাকারীদের সংজ্ঞায়িত করার জন্য অনেক বেশি হালকা উপায় রয়েছে। চলুন দেখে নেওয়া যাক।
গণনাকারী শ্রেণী প্রবর্তন করা হচ্ছে
গণনাকারী শ্রেণী আপনাকে ব্লক সিনট্যাক্স ব্যবহার করে এক-অফ গণনাকারীকে সংজ্ঞায়িত করতে দেয়। নীচের উদাহরণে, আমরা একটি গণনাকারী তৈরি করি যা র্যান্ডম সংখ্যার একটি অসীম সিরিজ প্রদান করে৷
e = Enumerator.new do |y|
loop do
y << rand(10) # The << operator "yields" a value.
end
end
# Make the enumerator "yield" 10 values, then stop
puts e.first(10).inspect # => [6, 6, 7, 2, 2, 9, 6, 8, 2, 1]
আপনি হয়তো লক্ষ্য করেছেন যে আমরা শিফট অপারেটর <<
ব্যবহার করছি একটি অদ্ভুত উপায়ে এটি y.yield
-এর জন্য একটি শর্টকাট পদ্ধতি আপনি গণনাকারীর প্রতিটি আইটেমের জন্য এটিকে কল করবেন। যদি এই সব আপনার কাছে একটু যাদুকর মনে হয়, চিন্তা করবেন না। এটা।
সংগ্রহের আকার
একটি সংগ্রহের আকার বের করা রুবির অলস গণনাকারীদের জন্য একটি সমস্যা তৈরি করে। একটি সংগ্রহে আইটেমগুলি গণনা করতে, আপনাকে সম্পূর্ণ সংগ্রহটি লোড করতে হবে - যা অলস গণনাকারী ব্যবহার করার সম্পূর্ণ বিন্দুর বিরুদ্ধে।
একটা কাজ আছে, ধরনের. আপনি গণনাকারী তৈরি করার সময় সংগ্রহের আকার জানতে পারলে আপনি তা প্রদান করতে পারেন।
# You can pass the length as an argument to the constructor, if you have it
e = Enumerator.new(10) do |y|
10.times { y << rand }
end
আমার বাস্তব জগতের উদাহরণ
গতকালই আমি হানিব্যাজারের নতুন ডকুমেন্টেশন সাইটে কাজ করছিলাম। এটি জেকিল ব্যবহার করে নির্মিত, এবং আমি <h2>
এর উপর ভিত্তি করে বিষয়বস্তুর একটি সারণী তৈরি করতে একটি প্লাগইন লিখছিলাম এবং <h3>
ডকুমেন্টেশনে ট্যাগ।
কোনটি <h3>
তা বের করা এক ধরনের বিশ্রী ট্যাগগুলি <h2>
দ্বারা সংজ্ঞায়িত একটি বিভাগের অন্তর্গত ট্যাগ. আপনাকে নোকোগিরি ব্যবহার করে HTML পার্স করতে হবে, এবং তারপর ফলাফল নথিটি স্ক্যান করতে হবে। তাই আমি কোডের যে বিট বিমূর্ত আউট এবং এটি একটি গণনাকারী করা. এটি দেখতে কেমন তা এখানে।
def subheadings(el)
Enumerator.new do |y|
next_el = el.next_sibling
while next_el && next_el.name != "h2"
if next_el.name == "h3"
y << next_el
end
next_el = next_el.next_sibling
end
end
end