কম্পিউটার

রুবিতে স্ট্রিংআইও:এটি কীভাবে কাজ করে এবং কীভাবে এটি ব্যবহার করবেন

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

তারপর StringIO আপনার জন্য।

আমি আপনাকে কিছু উদাহরণ এবং জিনিসগুলি দেখাই যার জন্য সতর্ক থাকতে হবে!

মৌলিক উদাহরণ

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

io = StringIO.new("abc")

তারপর আপনি gets এর মত পদ্ধতি ব্যবহার করে এই বস্তু থেকে পড়তে পারেন , read &each_line .

আমি আপনার জন্য সবচেয়ে দরকারী পদ্ধতিগুলির সাথে একটি সহজ টেবিল তৈরি করেছি:

পদ্ধতি বর্ণনা
পায় ইনপুটের একটি লাইন পড়ুন
পড়ুন একটি নির্দিষ্ট পরিমাণ বাইট পড়ুন (সমস্ত ডিফল্টরূপে)
each_line একটি ব্লক দেওয়া হয়েছে, প্রতিটি লাইনে পুনরাবৃত্তি করুন
each_char একটি ব্লক দেওয়া হয়েছে, প্রতিটি অক্ষরের উপর পুনরাবৃত্তি করুন
<< ডেটা যোগ করুন
রিওয়াইন্ড করুন অভ্যন্তরীণ অবস্থান পয়েন্টার পুনরায় সেট করুন
স্ট্রিং স্ট্রিংজিও অবজেক্ট থেকে একটি প্রকৃত স্ট্রিং ফেরত দেয়

লক্ষ্য করুন যে StringIO একটি অবস্থান নির্দেশক আছে৷

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

সুতরাং প্রতিবার আপনি gets এর মত একটি পদ্ধতি কল করুন অথবা read এটি আপনাকে সেই পরিমাণ ডেটা দেবে এবং পয়েন্টারকে অগ্রসর করবে।

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

io.each_line { |line| puts line }

আপনি rewind ব্যবহার করে শুরুতে অবস্থান পয়েন্টার রিসেট করতে পারেন পদ্ধতি:

io.pos
# 45

io.rewind

io.pos
# 0

এটি মৌলিক বিষয়ের জন্য।

আমি আপনাকে StringIO এর কিছু ব্যবহারিক ব্যবহার দেখাতে যাচ্ছি , কিন্তু প্রথমে আমি আপনাকে অন্য কিছু দেখাই।

স্ট্রিংস্ক্যানার সম্পর্কে কি?

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

সেই ক্লাসটি হল স্ট্রিংস্ক্যানার৷

এটি বিভ্রান্তিকর হতে পারে যেহেতু তাদের একই নাম এবং পদ্ধতি রয়েছে, তবে আমাকে পার্থক্য দেখতে আপনাকে সাহায্য করতে দিন।

মূল জিনিসটি হল এটি :

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

এই দুটি শ্রেণী এখনও কিছু শেয়ার করে, তাদের নামে "স্ট্রিং" থাকার পাশাপাশি, তারা উভয়েই একটি অভ্যন্তরীণ পজিশন পয়েন্টার ব্যবহার করে .

স্ট্যান্ডার্ড ইনপুট এবং আউটপুট প্রতিস্থাপন

ধরা যাক আপনি একটি কমান্ড-লাইন অ্যাপ্লিকেশন লিখছেন যা ব্যবহারকারীকে Kernel#gets পদ্ধতি ব্যবহার করে আউটপুট জিজ্ঞাসা করে…

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

তাহলে কি স্বয়ংক্রিয় পরীক্ষা ছবির বাইরে?

না, তা নয়!

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

উদাহরণ :

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

gets
# input

এই কৌশলটি puts এর মত পদ্ধতি থেকে আউটপুট ক্যাপচার করতেও ব্যবহার করা যেতে পারে .

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

উদাহরণ :

io      = StringIO.new("")
$stdout = io

# Print to $stdout
puts "Jesus Castello is from Spain & likes to help people learn Ruby."

# Restore original value
$stdout = STDOUT

io.rewind
io.read
# "Jesus Castello is from Spain & likes to help people learn Ruby."

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

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

সারাংশ

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

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

আপনি যদি StringIO এর কিছু আকর্ষণীয় ব্যবহার সম্পর্কে জানেন মন্তব্যে আমাদের জানান এবং এটি শেয়ার করতে ভুলবেন না নিবন্ধ যাতে আরো মানুষ এটি উপভোগ করতে পারে!


  1. রুবিতে রেক কী এবং এটি কীভাবে ব্যবহার করবেন

  2. একটি ম্যাট্রিক্স কি এবং রুবিতে এটি কীভাবে ব্যবহার করবেন?

  3. রুবি আলিয়াস কীওয়ার্ড কীভাবে ব্যবহার করবেন

  4. রুবিতে স্ট্রাকট এবং ওপেনস্ট্রাক্ট কীভাবে ব্যবহার করবেন