আপনি কি এমন একটি বস্তু খুঁজছেন যা একটি 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
এর কিছু আকর্ষণীয় ব্যবহার সম্পর্কে জানেন মন্তব্যে আমাদের জানান এবং এটি শেয়ার করতে ভুলবেন না নিবন্ধ যাতে আরো মানুষ এটি উপভোগ করতে পারে!