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

রুবির StringIO: কার্যকারিতা এবং ব্যাবহারিক অ্যাপ্লিকেশন বোঝা

আপনি কী একটি অবজেক্ট খুঁজছেন যা IO অবজেক্টের মতো আচরণ করে (ফাইল, সокেট, ইত্যাদি), কিন্তু যা আপনি একটি স্ট্রিংয়ের মতো কন্ট্রোল করতে পারেন?

তাহলে StringIO আপনার জন্য।

চলুন কিছু উদাহরণ এবং সতর্কতার বিষয়গুলো দেখি!

বেসিক উদাহরণ

একটি StringIO অবজেক্ট তৈরি করতে আপনি এটি করতে পারেন:

io = StringIO.new("abc") 

তারপর আপনি এই অবজেক্ট থেকে gets, read এবং each_line এর মতো মেথড ব্যবহার করে পড়তে পারেন।

আপনার জন্য একটি হ্যান্ডি টেবিল বানালাম সবচেয়ে উপযোগী মেথডগুলো নিয়ে:

মেথড বিবরণ
gets ইনপুটের একটি লাইন পড়ে
read নির্দিষ্ট পরিমাণ বাইট পড়ে (ডিফল্টভাবে সব)
each_line একটি ব্লক দেওয়া হলে, প্রতিটি লাইন ওভার ইটারেট করে
each_char একটি ব্লক দেওয়া হলে, প্রতিটি ক্যারেক্টার ওভার ইটারেট করে
<< ডেটা অ্যাপেন্ড করে
rewind ইন্টারনাল পজিশন পয়েন্টার রিসেট করে
string stringio অবজেক্ট থেকে আসল স্ট্রিং রিটার্ন করে

লক্ষ্য করুন StringIO-র একটি পজিশন পয়েন্টার আছে।

এই পয়েন্টারটি ট্র্যাক রাখে আপনি কত বাইট পড়েছেন, ঠিক একটি ফাইল অবজেক্টের মতো।

তাই প্রতিবার আপনি gets বা read এর মতো মেথড কল করলে সেটি 그만 ডেটা দেবে এবং পয়েন্টারটি এগিয়ে যাবে।

এমনারেবল মেথডগুলোর মত map বা each_line ও পজিশন পয়েন্টারকে এগিয়ে দেয়, তাই সেটি মনে রাখুন।

io.each_line { |line| puts line } 

আপনি rewind মেথড ব্যবহার করে পজিশন পয়েন্টারকে শুরুতে রিসেট করতে পারেন:

io.pos # 45 io.rewind io.pos # 0 

বেসিক्स এর জন্য এতটুকু।

আমি আপনাকে StringIO-র কিছু ব্যাবহারিক ব্যবহার দেখাব, কিন্তু আগে একটু অন্য কিছু দেখাতে দিন।

StringScanner কী?

এখন আপনি দেখেছেন StringIO কী করতে পারে, কিন্তু রুবি স্ট্যান্ডার্ড লাইব্রেরিতে আরেকটি স্ট্রিং-রিলেটেড ক্লাস আছে।

সেটি হলো StringScanner।

এটি বিভ্রান্তিকারী হতে পারে যেহেতু তাদের নাম এবং মেথডগুলো মিলता-জুলতা, কিন্তু আমি আপনাকে পার্থক্য বুঝতে সাহায্য করব।

মূল বিষয়টি হলো:

একটি StringIO অবজেক্ট অন্য একটি IO অবজেক্ট (যেমন File বা Socket) কে রিপ্লেস করতে পারে, কিন্তু StringScanner পার্সিং-এর জন্য বানানো (কিছু টেক্সটকে বুঝতে টোকেনের একটি সেটে ভাঙা)।

এই দুটি ক্লাসে এখনো কিছু সাধারণ আছে, "String" তাদের নামে থাকা বাদে, তারা উভয়ই একটি ইন্টারনাল পজিশন পয়েন্টার ব্যবহার করে।

স্ট্যান্ডার্ড ইনপুট ও আউটপুট রিপ্লেস করা

মান लीজिए আপনি একটি কমান্ড-লাইন অ্যাপ্লিকেশন লিখছেন যা Kernel#gets মেথড ব্যবহার করে ইউজার থেকে আউটপুট চেয়ে…

…যদি আপনি এই কোডটি টেস্ট করতে চান তবে আপনাকে প্রতিবার হাত দিয়ে ইনপুট দিতে হবে।

তাহলে অটোমেটেড টেস্টিং আউট অফ পিকচার?

না, এটি নয়!

এখানেই StringIO রক্ষা করতে আসে। আপনি আপনার টেস্ট ইনপুট দিয়ে একটি StringIO অবজেক্ট ইনিশিয়ালাইজ করতে পারেন এবং তারপর $stdin tarafından নির্দেশিত স্ট্যান্ডার্ড ইনপুট অবজেক্টকে রিপ্লেস করতে পারেন (এই হলো যেন রুবি gets কল করলে ইউজার ইনপুটের জন্য তাকায়)।

উদাহরণ:

io = StringIO.new("input") $stdin = io gets # input 

এই টেকনিকটি puts এর মতো মেথড থেকে আউটপুট ক্যাপচার করতেও ব্যবহার করা যায়।

ডিসপ্লে মেথডগুলো ডিফল্ট আউটপুট ডিভাইসে প্রিন্ট করে, যাকে 'স্ট্যান্ডার্ড আউটপুট' বলা হয়। রুবিতে এটি একটি IO অবজেক্ট দ্বারা রিপ্রেজেন্ট করা হয় যা আপনি আপনার StringIO অবজেক্ট দিয়ে রিপ্লেস করতে পারেন।

উদাহরণ:

io = StringIO.new("") $stdout = io # $stdout-এ প্রিন্ট করুন puts "Jesus Castello is from Spain & likes to help people learn Ruby." # মূল মান ফেরত দিন $stdout = STDOUT io.rewind io.read # "Jesus Castello is from Spain & likes to help people learn Ruby." 

এটি ইনপুট ভার্সনের চেয়ে বেশি জটিল, কারণ আমরা চাই মূল STDOUT অবজেক্টটি ফেরত দিতে এবং আমাদের StringIO-কে রিওয়াইন্ড করতে যাতে আউটপুট পড়া যায়।

লক্ষ্য করুন অধিকাংশ টেস্টিং ফ্রেমওয়ার্কে এটি করার জন্য একটি মেথড থাকে (Minitest-এ assert_output এবং RSpec-এ আউটপুট ম্যাচার), কিন্তু পিছনে কী হচ্ছে সেটি জানা সবসময় ভালো 🙂

সারসংক্ষেপ

আপনি StringIO ক্লাস সম্পর্কে শিখেছেন, যা একটি আসল IO অবজেক্টকে অনুকরণ করে যাতে সেটি সেরকম অবজেক্টের রিপ্লেসমেন্ট হিসেবে কাজ করতে পারে।

এটি স্ক্রিনে আউটপুট লেখা বা টার্মিনালের মাধ্যমে ইউজার ইনপুট নেওয়া ক্লাস টেস্ট করার জন্য উপযোগী হতে পারে।

আপনি যদি StringIO-র কিছু আকর্ষণীয় ব্যবহার জানেন তবে কমেন্টে জানাতে পারেন এবং এই আর্টিকেল শেয়ার করা না ভুলেন যাতে আরও মানুষ এনজয় করতে পারে!


  1. রুবিতে Rake মাস্টার করুন: টাস্ক অটোমেশন-এর সম্পূর্ণ গাইড

  2. রুবি ম্যাট্রিক্স বুঝতে: ডেফিনিশন, অ্যাপ্লিকেশন এবং কীভাবে তৈরি করবেন

  3. রুবি মাস্টারিং: মেথড এলিয়াস তৈরি করার জন্য Alias কিওয়ার্ড ব্যবহার

  4. রুবি Struct ও OpenStruct: দক্ষ ভ্যালু অবজেক্টস