আপনি একটি পূর্ণসংখ্যার সাথে কাজ করছেন কিন্তু আপনি স্ট্রিং পদ্ধতি ব্যবহার করতে চান (যেমন gsub ) পরিবর্তে।
আপনি কি করতে পারেন?
এটিকে একটি স্ট্রিংয়ে রূপান্তর করুন (to_s সহ ) তারপর এটিকে একটি পূর্ণসংখ্যাতে রূপান্তর করুন (to_i সহ )।
উদাহরণস্বরূপ :
আপনি Integer রূপান্তর করতে পারেন String-এ 1 "1"।
তারপরে আপনি নতুন ক্লাস থেকে পদ্ধতিগুলি ব্যবহার করতে পারেন, যা আপনাকে এমন কিছু করতে সহায়তা করে যা আগে সম্ভব ছিল না।
রুবিতে মনে রাখবেন…
প্রতিটি বস্তু একটি শ্রেণীর সাথে যুক্ত, এবং প্রতিটি শ্রেণীর একটি নির্দিষ্ট পদ্ধতি রয়েছে।
এই নিবন্ধে, আপনি সম্পর্কে জানতে যাচ্ছেন :
- রুবিতে কি রূপান্তর পদ্ধতি পাওয়া যায়
- তাদের মধ্যে পার্থক্য কি!
- বিভিন্ন পরিস্থিতিতে কীভাবে সঠিকটি বেছে নেবেন
এটা করা যাক!
সংক্ষিপ্ত রূপান্তর পদ্ধতি (to_s, to_i)
আপনি সম্ভবত রূপান্তর পদ্ধতির এই প্রথম গ্রুপের সাথে পরিচিত।
পদ্ধতি যেমন :
- to_i
- to_s
- to_a
এই পদ্ধতিগুলি একটি নির্দিষ্ট শ্রেণীর একটি নতুন অবজেক্ট প্রদান করে যা বর্তমান অবজেক্টের প্রতিনিধিত্ব করে।
উদাহরণস্বরূপ :
(1..10).to_a # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
এটি বলে :
“আমি
Rangeরূপান্তর করতে চাই 1..10 একটিArrayএ যেটি সেই পরিসরের প্রতিনিধিত্ব করে।"
রুবি আপনার জন্য এই রূপান্তর পদ্ধতিগুলিকে অন্তর্নিহিতভাবে কল করার উপায় রয়েছে৷
স্ট্রিং ইন্টারপোলেশনের মতো:
"#{1}"
এটি 1.to_s কল করে আপনার জন্য, এমনকি যদি আপনি এটি দেখতে না পান।
আপনি এই কোড দিয়ে নিজেকে পরীক্ষা করতে পারেন :
module Log
def to_s
puts "to_s called"
super
end
end
class Integer
prepend Log
end
puts "#{1}"
# "to_s called"
দ্রষ্টব্য :আপনাকে
Fixnumব্যবহার করতে হবেIntegerএর পরিবর্তে আপনি যদি রুবি 2.3 বা তার বেশি বয়সী হন। অথবা আরও ভাল, আপনার রুবি সংস্করণ আপডেট করুন 🙂
এই পদ্ধতিগুলি বেশ অনুমোদনযোগ্য এবং এগুলি একটি ব্যতিক্রম উত্থাপন করার কথা নয়৷
উদাহরণস্বরূপ :
"aaaaaa".to_i # 0
এই 0 আপনাকে অবাক করে দিতে পারে।
কিন্তু আপনি to_i কল করলে সেটাই পাবেন পূর্ণসংখ্যা ছাড়াই একটি স্ট্রিং-এ।
আপনি এই নিবন্ধে পরে দেখতে পাবেন এই পদ্ধতির আরও কঠোর সংস্করণ রয়েছে .
দীর্ঘ রূপান্তর পদ্ধতি (to_str, to_int)
এখন:
আমাদের যদি সেই সংক্ষিপ্ত রূপান্তর পদ্ধতি থাকে, তাহলে কেন আমাদের to_str এর মত পদ্ধতির প্রয়োজন হবে , অথবা to_int ?
পার্থক্য কি?
পার্থক্যটা তাদের উদ্দেশ্যের মধ্যে।
প্রতিটি রুবি ক্লাস (BasicObject বাদ দিয়ে ) to_s প্রয়োগ করে কিছু ধরণের স্ট্রিং উপস্থাপনা হিসাবে নিজেকে ফেরানোর পদ্ধতি।
কিন্তু শুধুমাত্র একটি ক্লাস একটি স্ট্রিং ফেরত দেওয়ার মানে এই নয় যে এটি একটি স্ট্রিংয়ের মতো আচরণ করে!
একটি উদাহরণ দেখি :
"" + 1 # TypeError: no implicit conversion of Fixnum into String
এটি সম্পর্কে চিন্তা করুন :
একটি খালি স্ট্রিং প্লাস পূর্ণসংখ্যা ফেরত কি উচিত?
আমি জানি না।
আপনি বলতে পারেন "1" (একটি নম্বর সহ একটি স্ট্রিং)।
কিন্তু কেন?
বেশিরভাগ লোকেরা এই ক্ষেত্রে যা আশা করে তা নয়।
এগুলি যোগ করার কোন মানে হয় না... তাই আমরা এই TypeError পাই .
এবং এমনকি যদি এটি অনুমোদিত হয়।
এটি সম্পর্কে কি :
"" + {}
এটি একটি খালি স্ট্রিং এবং একটি খালি হ্যাশ৷
৷কোন মানে হয় না!
তাই রুবি অন্য বস্তুটি একটি স্ট্রিং কিনা তা পরীক্ষা করার পরিবর্তে, যা পলিমরফিজমের জন্য ভাল হবে না, এটি একটি স্ট্রিংয়ের মতো কাজ করে কিনা তা পরীক্ষা করে।
সেখানেই to_str পদ্ধতি আসে।
রুবি 2.5-এ to_str প্রয়োগ করা একমাত্র ক্লাস :
StringNameError::messageWarning::buffer
আপনার নিজস্ব রূপান্তর পদ্ধতি কিভাবে প্রয়োগ করবেন
আপনি to_str বাস্তবায়ন করতে পারেন যেকোনো ক্লাসে।
তারপর আপনি এটি একটি স্ট্রিং মত ব্যবহার করতে সক্ষম হবেন.
এখানে একটি উদাহরণ আছে :
class Cat
def to_str
"meow"
end
end
"" + Cat.new
# "meow"
কিন্তু যদি না আপনার ক্লাস একটি স্ট্রিংয়ের সমতুল্য হয় তাহলে আপনার এটি করা উচিত নয় .
to_s ব্যবহার করুন পরিবর্তে।
Btw, এটি শুধুমাত্র + এর জন্য নয় পদ্ধতি।
এটি অন্যান্য জায়গায়ও ব্যবহার করা হয় যেখানে শুধুমাত্র একটি স্ট্রিং-এর মতো বস্তুর অর্থ হয়।
লাইক :
[1,2,3].join(",")
অন্যান্য দীর্ঘ রূপান্তর পদ্ধতি যেমন to_int &to_hash একই যুক্তি অনুসরণ করুন।
সেজন্য আমাদের এই বিভিন্ন পদ্ধতি আছে।
কিভাবে রূপান্তর র্যাপার ব্যবহার করবেন
আপনার যদি এখনও পর্যাপ্ত রূপান্তর পদ্ধতি না থাকে... চিন্তা করবেন না কারণ আমার কাছে আপনার জন্য আরও কিছু আছে!
আমি এইগুলিকে "রূপান্তর মোড়ক" বলতে চাই৷
৷তারা হল :
- অ্যারে()
- পূর্ণসংখ্যা()
- হ্যাশ[]
এটি সেখানে কিছু অস্বাভাবিক-সুদর্শন পদ্ধতি!
বন্ধনী এবং বর্গাকার বন্ধনী লক্ষ্য করুন…
…এই পদ্ধতিগুলিকে তাদের ক্লাসের নাম থেকে আলাদা করার একমাত্র জিনিস৷
৷এগুলির উদ্দেশ্য কী?
অ্যারে() যেকোনো কিছুকে অ্যারেতে রূপান্তর করবে।
আপনার জন্য এখানে কিছু উদাহরণ দেওয়া হল :
Array(nil)
# []
Array([])
# []
Array(1)
# [1]
Array("")
# [""]
এটা কি ধরনের যুক্তি???
ঠিক আছে, এই পদ্ধতিটি নিয়মগুলির একটি খুব নির্দিষ্ট সেট অনুসরণ করে :
- যদি বস্তুটি
to_ary-এ সাড়া দেয় , অথবাto_aএটি কল করবে এবং মান ফেরত দেবে - অন্যথায়, এটি বস্তুটিকে একটি খালি অ্যারের ভিতরে রাখবে এবং তা ফেরত দেবে
এটি উপরে দেখানো আচরণ ব্যাখ্যা করে।
এটি দরকারী যদি আপনি এমন একটি পদ্ধতি লিখছেন যা একটি অ্যারের আশা করে তবে এটি অন্য কিছু পেতে পারে এবং আপনার পদ্ধতিটি পুরো অ্যাপ্লিকেশনটিকে ক্র্যাশ করতে পারে। আপনি Array() এ পাস করে এটি একটি অ্যারে তা নিশ্চিত করতে পারেন এটি এড়াতে প্রথমে।
এখন Integer() .
এর কিছু বিশেষ নিয়ম আছে :
- যদি বস্তুটি একটি স্ট্রিং হয় এবং স্ট্রিংয়ের বিষয়বস্তু রুবিতে একটি বৈধ সাংখ্যিক উপস্থাপনাকে কঠোরভাবে মেনে চলে তাহলে এই পদ্ধতিটি একটি পূর্ণসংখ্যা প্রদান করবে।
ArgumentErrorউত্থাপন করে যদি অবৈধ বিন্যাস। - যদি বস্তুটি একটি স্ট্রিং না হয় তবে এটি
to_intকল করার চেষ্টা করবে , তারপরto_i. - এটি একটি
TypeErrorবাড়াবে যদি বস্তুটিকে একটি বৈধIntegerএ রূপান্তর করা না যায় একটি রূপান্তর পদ্ধতি ব্যবহার করে৷
উদাহরণ :
Integer(1)
# 1
Integer("25")
# 25
Integer("abc123")
# ArgumentError (invalid value for Integer(): "abc123")
Integer([])
# TypeError (can't convert Array into Integer)
এই Integer() আপনি যদি 100% নিশ্চিত করতে চান যে আপনি একটি বৈধ Integer এর সাথে কাজ করছেন তবে পদ্ধতিটি কার্যকর। .
এখন Hash[] .
আপনি এমন উপাদানের একটি অ্যারে পাস করতে পারেন একটি নতুন হ্যাশ পেতে:
Hash[[["a", 1], ["b", 2], ["c", 3]]]
# {"a"=>1, "b"=>2, "c"=>3}
আপনি যদি দুটি অ্যারের উপাদানগুলিকে একত্রিত করে বা মানচিত্রের মতো একটি পদ্ধতি ব্যবহার করে আপনার হ্যাশ তৈরি করেন তাহলে এটি কার্যকর৷
সারাংশ
আপনি রুবিতে বিভিন্ন রূপান্তর পদ্ধতি সম্পর্কে শিখেছেন, কেন সেগুলি বিদ্যমান এবং কীভাবে সেগুলি ব্যবহার করতে হয়!
আমি আশা করি আপনি এটি সহায়ক খুঁজে পেয়েছেন 🙂
আপনি যদি এই নিবন্ধটি উপভোগ করেন তবে আপনি আমার বইটিও পছন্দ করবেন, রুবি ডিপ ডাইভ, এটি দেখুন৷