কম্পিউটার টিউটোরিয়াল

রুবি ২.৭ রিলিজ: মূল ফিচার, মেথড এবং পারফরম্যান্স উন্নতি

রুবি কখনো উন্নতি থামায় না!

ভার্সন ২.৭ নতুন ফিচার, মেথড এবং পারফরম্যান্স উন্নতির সাথে এসেছে। এটি ২৫ ডিসেম্বর, ২০১৯-এ রিলিজ হয়েছিল।

এখন, Matz-র mukaan…

এটি লাস্ট ২.x ভার্সন রিলিজ। কারণ আগামী বছর আমরা রুবি ৩.০ পাব!

কিন্তু সেটির আগে…

চলুন ২.৭-এ কিছু পরিবর্তন এবং নতুন ফিচার দেখি, যাতে আপনি ভার্সন আপডেটের জন্য প্রস্তুত থাকেন।

বিষয়সূচি

  • 1 Enumerable#tally
  • 2 ব্লকের জন্য নম্বরড প্যারামিটার [এক্সপেরিমেন্টাল]
  • 3 Array#intersection
  • 4 Enumerable#filter_map
  • 5 Enumerator#produce
  • 6 IRB-এ ফেস লিফট?
  • 7 রুবি প্যাটার্ন ম্যাচিং [এক্সপেরিমেন্টাল]
  • 8 অন্যান্য পরিবর্তন
  • 9 সারাংশ
    • 9.1 সম্পর্কিত

Enumerable#tally

এটি একটি নতুন রুবি মেথড যা একটি অ্যারেতে সকল এলিমেন্ট গণনা করে এবং তাদের কাউন্টসহ একটি হ্যাশ রিটার্ন করে।

আপনি এটি নিজে করতে পারেন, কিন্তু এই tally মেথড আপনার কাজ বাঁচায়।

এখানে একটি উদাহরণ:

 %w(a a a b b c).tally 

ফলাফল:

 {"a"=>3, "b"=>2, "c"=>1} 

আমি এটি পছন্দ করি!

ব্লকের জন্য নম্বরড প্যারামিটার [এক্সপেরিমেন্টাল]

একটি আকর্ষণীয় নতুন ফিচার, যা আমি কিছুক্ষণ ধরে চাইছিলাম, হলো ব্লক প্যারামিটারের জন্য একটি ডিফল্ট নাম।

এখানে একটি রেগুলার ব্লক, একটি প্যারামিটারসহ:

 [1,2,3].each { |n| puts n } 

এই |n| হলো প্যারামিটার, যা আপনাকে ডিফাইন করতে হয় এটি ব্যবহার করার জন্য।

কিন্তু যদি আমাদের একটি ডিফল্ট নাম থাকত?

খুব, এটিই রুবি ২.৭-এ আসা 굿িজগুলোর একটি, যদিও এক্সপেরিমেন্টাল ফিচার হিসেবে, এটি আমাদের অনেক টাইপিং বাঁচাতে পারে।

এটি এইরকম দেখায়:

 [1,2,3].each { puts _1 } 

যেখানে _1 প্রথম প্যারামিটারকে রেফার করে, আপনি _2 ব্যবহার করতে পারেন যদি আপনার ২য় প্যারামিটার থাকে, এবং হ্যাঁ, ৩য় প্যারামিটারের জন্য _3, ইত্যাদি।

খুব কুল!

এখন, একটু ট্রিভিয়া।

এই ফিচারটি প্রথম প্রপোজ করা হয়েছিল @1-এর মতো দেখাতে, কিন্তু এটি অনেক ইনস্ট্যান্স ভেরিয়েবলের মতো লাগে, তাই কিছু আলোচনার পর, এটি _1 ব্যবহার করা ঠিক করা হয়।

Array#intersection

এটি একটি নতুন মেথড, কিন্তু নতুন ফাংশনালিটি নয়।

আসলে…

এটি আরও একটি অ্যালিয়াসের মতো!

রুবি ২.৬ Array union এবং difference মেথড চালু করেছিল, Array#| এবং Array#--এর আরও সংক্ষিপ্ত সমতুল্য হিসেবে।

কিন্তু অনুপস্থিত অপারেশন ছিল intersection, যেটির আরেকটি হার্ড-টু-রিমেম্বার সংক্ষিপ্ত ভার্সন আছে।

Array#& মেথড।

এখন:

এই মেথডগুলো কী করে এবং কীভাবে কাজ করে?

উদাহরণ:

 [1, 2, 3].intersection([2, 3, 4]) # [2, 3] [1, 2, 3] & [2, 3, 4] # [2, 3] 

ভালো…

নামটিই ইঙ্গিত দেয়, intersection দুটি অ্যারের মধ্যে ইন্টারসেকশন খুঁজে বের করে। অন্য কথায়, এটি খুঁজে বের করে কোন এলিমেন্টগুলো সাধারণ।

সংক্ষিপ্ত ভার্সন বিস্তারিত ভার্সন
& intersection
| union
– difference

আমি সকল সময় এই ৩টি মেথডের মধ্যে কে কী করে সেটা ভুলে যাই!

কিন্তু এই নতুন মেথডগুলোতে, এটি বহুত বেশি স্মরণ করা সহজ কারণ তাদের নাম কিছু অর্থ বহন করে।

এটি ভালো কোড লিখার একটি ভালো লেসন, বтв।

Enumerable#filter_map

এই filter_map মেথড select এবং map মেথডগুলো একসাথে কম্বাইন করার একটি চেষ্টা।

কেন?

কারণ একটি লিস্ট আগে ফিল্টার করে তারপর বাকি এলিমেন্টগুলো ম্যাপ করা একটি সাধারণ অপারেশন।

আপনি এটি দুভাবেই করতে পারেন:

 (1..8).select(&:even?).map { |n| n ** 2 } # OR (1..8).map { |n| n ** 2 if n.even? }.compact 

আমি দুটোই ব্যবহার করেছি, কিন্তু আমি প্রথমটার দিকে ঝুঁকে যাই কারণ ইন্টেনশন আরও স্পষ্ট।

এখন:

রুবি ২.৭-এ, এই filter_map মেথড এটি এক পাসে করে।

এভাবে:

 (1..8).filter_map { |n| n ** 2 if n.even? } # [4, 16, 36, 64] 

আমি ব্লকের ভিতরে if স্টেটমেন্ট থাকার বড় ফ্যান নই, কিন্তু কখনও কখনও সেগুলো দরকার হয় কাজটি করা টি করতে।

এর বাইরে, একটা জিনিস জানা উচিত।

filter_map অপারেশন map + compact-এর মতো বিহ্যেইভ করে না, কারণ এটি false অবজেক্ট রিমুভ করে, এবং compact করে না।

মনে রাখার একটি ভালো জিনিস!

Enumerator#produce

এখানে আরেকটি নতুন মেথড যা আপনি আকর্ষণীয় পেতে পারেন, কিন্তু এটি কিছু সৃজনশীলতা দরকার সর্বোচ্চ ফলাফল পেতে।

এটি হলো Enumerator#produce মেথড।

এটি কী করে?

ফিচার প্রপোজাল অনুযায়ী:

“This method produces an infinite sequence where each next element is calculated by applying the block to the previous element.”

হ্যাঁ।

এনডলেস সিকোয়েন্স তৈরি করার আরেকটি উপায়!

এখানে একটি উদাহরণ:

 Enumerator.produce(1, &:next).take(5) # [1, 2, 3, 4, 5] 

এই উদাহরণে, এটা মানে রাখে না আপনি take(10) করেন নাকি take(10_000), আপনি এটি থেকে অসীম সংখ্যক ভ্যালু পাবেন।

বিটিডব্লিউ, 1 হলো ইনিশিয়াল ভ্যালু।

এবং &:next হলো সেই ভ্যালুতে কল করা মেথড যা সিকোয়েন্সের পরবর্তী এলিমেন্ট produce করে।

IRB-এ ফেস লিফট?

সাম্প্রতিক সময়ে, IRB কিছু লাভ ও মনোযোগ পাচ্ছে, এবং রুবি ২.৭ সেটি আরও বাড়াচ্ছে।

আমরা পাচ্ছি:

  • মাল্টি-লাইন এডিটিং
  • সিনট্যাক্স হাইলাইটিং
  • বিল্ট-ইন RDoc ইন্টিগ্রেশন
  • ডিফল্টভাবে কমান্ড হিস্টরি সক্ষম
  • ডিফল্টভাবে অটো-কম্পলিশন সক্ষম

বস্তুতঃ:

এটি इतना বড় পরিবর্তন যে আপনি রুবি ২.৭-এ irb स्टার্ট করলে একটি সতর্কতা পাবেন।

আপনি যদি পুরনো ভার্সনের irb ব্যবহার করতে চান, আপনি এখনও পারেন, irb --legacy কমান্ড দিয়ে। আমার এই নতুন IRB-এ মূল সমস্যা হলো লাইন এডিটিং, লিগেসি IRB (বা Pry-তে) আমি ALT ধরে লেফট অ্যারো চাপলে দ্রুত মুভ করতে পারতাম, কিন্তু নতুন IRB-এ এটি কাজ করে না।

এটি ট্রাই করুন এবং দেখুন আপনার জন্য কীভাবে কাজ করে।

রুবি প্যাটার্ন ম্যাচিং [এক্সপেরিমেন্টাল]

একটি অনুরোধ করা ফিচার যা ২.৭-এ আসছে হলো প্যাটার্ন ম্যাচিং।

এটি এক্সপেরিমেন্টাল হিসেবে চিহ্নিত।

কিন্তু প্যাটার্ন ম্যাচিং কী এবং এটি আপনাকে কীভাবে উপকৃত করে?

খুব, আমি যদি সঠিক বুঝি, প্যাটার্ন ম্যাচিং রেগুলার এক্সপ্রেশনের মতো, কিন্তু ডেটা স্ট্রাকচারের জন্য (Array/Hash)।

এখানে একটি উদাহরণ:

 [1,2,3] in [a,b,c] # true [1,2,3] in [a] # false 

যদি ম্যাচ থাকে, তবে এই ভেরিয়েবল নামগুলো (যেমন a) লোকাল ভেরিয়েবল হয়ে যায় যেগুলো আপনি অ্যাক্সেস করতে পারেন।

হ্যাশের সাথে উদাহরণ:

 { a: 1, b: 2, c: [] } in { a: a, b: b, c: [] } # true p a # 1 

এটি in কিওয়ার্ড ব্যবহার করে।

এটি নতুন নয়, কিন্তু অপচলিত কারণ রুবি ২.৭-এর আগে in শুধু একটি for লুপের অংশ হিসেবে ব্যবহৃত হত (রুবিতে অত্যন্ত নিরুৎসাহিত), তাই আমরা এই কিওয়ার্ডটি কiché কিছু উপকারী জন্য পুনরায় ব্যবহার করতে পাচ্ছি।

এছাড়া ভালো খবর…

এটি মানে রাখে না আপনি কী ভেরিয়েবল ব্যবহার করছেন, a,b,c এখানে কাজ করে, কিন্তু f,g,h ও কাজ করে।

এটি সব প্যাটার্নের জন্য!

অন্যান্য পরিবর্তন

কয়েকটি অতিরিক্ত পরিবর্তন যা উল্লেখ করা উচিত।

  • নতুন কম্প্যাকশন GC মেমরি ফ্র্যাগমেন্টেশন উন্নত করে
  • মেথড আর্গুমেন্ট **nil এখন ঘোষণা করে যে একটি মেথড কোনো কিওয়ার্ড নেয় না
  • মেথড আর্গুমেন্ট ... একটি আর্গুমেন্ট ফরওয়ার্ডিং মেকানিজম যোগ করে (প্যারেনথেসিস রিকোয়ারড, যেমন make_salad(...))
  • ফাইবার উন্নতি। ফাইবার অবজেক্টের একটি নতুন পুল (যেখান থেকে নতুন ফাইবার অ্যালোকেট হয়) ফাইবারকে আরও দক্ষ করে
  • থ্রেড উন্নতি। থ্রেড তৈরির একটি আরও ভালো, অপ্টিমাইজড উপায় মাল্টি-থ্রেডিংকে দ্রুত করে

আপনি এই গুলো সম্পর্কে কী ভাবেন?

২.৭-এর NEWS ফাইলে ফাইবার এবং থ্রেড তৈরিতে ১০x পারফরম্যান্স উন্নতির কথা বলা আছে, আমি নিজে এটি টেস্ট করিনি, কিন্তু আপনি যদি করেন তবে আপনার রেজাল্ট আমাকে জানান।

সারাংশ

আপনি এখন রুবি প্রোগ্রামিং ল্যাঙ্গুয়েজের লেটেস্ট পরিবর্তনগুলো নিয়ে আপ টু ডেট! আপনি IRB পরিবর্তন, নতুন মেথড এবং প্যাটার্ন ম্যাচিংর মতো কিছু এক্সপেরিমেন্টাল ফিচার সম্পর্কে শিখেছেন।

এই আর্টিকেল শেয়ার করুন খবর ছড়িয়ে দিতে!

পড়ার জন্য ধন্যবাদ 🙂


  1. রুবি ২.৬-এ ৯টি গুরুত্বপূর্ণ উন্নতির অন্বেষণ

  2. উইন্ডোজ ৮.১ আপডেট ১: টাস্কবার, মাউস, এবং স্টার্ট স্ক্রিনে মূল উন্নতি

  3. মাইক্রোসফট উইন্ডোজ ১১: মূল ফিচার, উন্নতি ও আপগ্রেড গাইড

  4. উইন্ডোজ ১১ লঞ্চ: লেটেস্ট আপডেটের মূল ফিচার ও উন্নতি