একটি বস্তুর পরিবর্তনযোগ্য হওয়ার মানে কি?
অভিনব শব্দ আপনাকে বিভ্রান্ত করতে দেবেন না, “পরিবর্তনশীলতা " এর মানে হল যে একটি বস্তুর অভ্যন্তরীণ অবস্থা পরিবর্তন করা যেতে পারে। এটি সমস্ত বস্তুর ডিফল্ট, যেগুলিকে হিমায়িত করা হয়েছে বাদে , অথবা যেগুলি বিশেষ বস্তুর তালিকার অংশ৷
৷অন্য কথায়, রুবির সমস্ত বস্তু পরিবর্তনযোগ্য নয়!
উদাহরণস্বরূপ :
সংখ্যা বা চিহ্ন বা এমনকি true
-এর জন্য এটির কোনো মানে হয় না অথবা false
(যা বস্তুও) পরিবর্তন করতে।
সংখ্যা 1 সর্বদা 1 হতে চলেছে।
কিন্তু অন্যান্য অবজেক্ট, বিশেষ করে যেগুলি ডেটা সঞ্চয় করার জন্য, যেমন অ্যারে বা হ্যাশ অবজেক্ট, তাদের পারফরম্যান্সের কারণে পরিবর্তন করার ক্ষমতা থাকা উচিত।
বিকল্প কি?
আপনি একটি নতুন অনুলিপি তৈরি করতে পারেন৷ পরিবর্তন সহ একটি বস্তুর এবং তারপরে আসল বস্তুটিকে অক্ষত রেখে এই নতুন বস্তুটি ফিরিয়ে দিন।
যদি অ্যারেগুলি অপরিবর্তনীয় হয় এবং আপনি একটি অ্যারের শুধুমাত্র একটি উপাদান পরিবর্তন করতে চেয়েছিলেন, আপনাকে সমস্ত ডেটা কপি করতে হবে, সেই উপাদানগুলি সহ যা পরিবর্তিত হয়নি৷
কল্পনা করুন যে প্রতিবার আপনাকে কোনো পরিবর্তন করতে হলে একটি মিলিয়ন (বা তার বেশি) উপাদান অ্যারে অনুলিপি করতে হবে, তা যত ছোটই হোক না কেন! খুব দক্ষ নয়…
যাই হোক।
রুবিতে পরিবর্তনশীলতা কীভাবে কাজ করে তা একটু গভীরভাবে দেখি।
পয়েন্টার হিসাবে পরিবর্তনশীলতা এবং ভেরিয়েবলগুলি
প্রোগ্রামিং ত্রুটির একটি বিভাগ আছে যা দুটি জিনিসের সংমিশ্রণ দ্বারা সৃষ্ট হয়:
- পরিবর্তনযোগ্য বস্তু।
- সত্য যে ভেরিয়েবলগুলিতে সরাসরি ডেটা থাকে না, তবে এই ডেটা কোথায় সংরক্ষণ করা হয় তার একটি রেফারেন্স৷
একটি উপায় হল এই ত্রুটিগুলি নিজেকে দেখায় যখন আপনি একটি ভেরিয়েবলকে 'উনাম' করার চেষ্টা করেন।
এখানে একটি উদাহরণ :
name = "Peter" other_name = name puts other_name # "Peter"
এই উদাহরণে, উভয়ই name
এবং other_name
একই স্ট্রিং অবজেক্টের একটি রেফারেন্স রয়েছে। আপনি এই স্ট্রিং এর বিষয়বস্তু প্রদর্শন বা পরিবর্তন করতে ব্যবহার করতে পারেন।
যদি আমরা other_name
এর সাথে আচরণ করি তাহলে সমস্যা দেখা দেয় স্ট্রিং এর একটি অনুলিপির মত।
other_name[0] = 'T' name # "Teter" other_name # "Teter"
যেহেতু উভয় ভেরিয়েবল একই স্ট্রিংকে নির্দেশ করে, আমরা শুধু "Peter" কে "Teter" এ পরিবর্তন করেছি। এটি একটি সমস্যা কারণ আমরা সম্ভবত "পিটার"কে আশেপাশে রাখতে চেয়েছিলাম৷
৷ক্লোনিং অবজেক্ট
এই সমস্যাটি মোকাবেলা করার একটি উপায় হল dup
ব্যবহার করা পদ্ধতি।
এটি রুবিকে আপনাকে বস্তুটির একটি অনুলিপি দিতে বলবে। এছাড়াও একটি clone
আছে পদ্ধতি, যা আপনাকে বস্তুর একটি অনুলিপি দেওয়ার পাশাপাশি, এটি হিমায়িত স্থিতি এবং বস্তুতে সংজ্ঞায়িত যেকোন সিঙ্গলটন পদ্ধতিগুলি অনুলিপি করে৷
একটি উদাহরণ দেখা যাক :
numbers = [1, 2, 3] more_numbers = numbers.dup more_numbers << 4 numbers # [1, 2, 3] more_numbers # [1, 2, 3, 4]
এই উদাহরণে, আপনি দেখতে পারেন কিভাবে আসল numbers
অ্যারে অপরিবর্তিত ছিল। সেই dup
সরানোর চেষ্টা করুন তৃতীয় লাইনে কল করুন এবং দেখুন কি হয় 🙂
রুবি ফ্রিজ পদ্ধতি
একটি বস্তুকে অবাঞ্ছিত পরিবর্তন থেকে নিরাপদ রাখার আরেকটি উপায় হল এটিকে 'হিমায়িত' করা। freeze
ব্যবহার করে যেকোনো রুবি বস্তু হিমায়িত করা যেতে পারে পদ্ধতি।
যখন একটি বস্তু হিমায়িত হয়, তখন এই বস্তুটি পরিবর্তন করার যেকোনো প্রচেষ্টার ফলে একটি RuntimeError
হবে ব্যতিক্রম।
দ্রষ্টব্য:আপনি
frozen?
ব্যবহার করতে পারেন একটি বস্তু হিমায়িত কি না তা পরীক্ষা করার পদ্ধতি৷
উদাহরণ :
animals = %w( cat dog tiger ) animals.freeze animals << 'monkey' # RuntimeError: can't modify frozen Array
একটি জিনিস মনে রাখতে হবে যে এটি শুধুমাত্র একটি বস্তুকে হিমায়িত করবে, এই উদাহরণে অ্যারে নিজেই, যা আমাদের এটি থেকে আইটেমগুলি যোগ করা বা সরিয়ে নেওয়া থেকে বাধা দেয়। কিন্তু অ্যারের ভিতরের স্ট্রিংগুলি হিমায়িত হয় না, তাই সেগুলি এখনও পরিবর্তন করা যেতে পারে !
animals[1][0] = 't' # => ["cat", "tog", "tiger"]
আপনি যদি স্ট্রিংগুলিকে হিমায়িত করতে চান তবে আপনাকে freeze
কল করতে হবে তাদের উপর এই মত:animals.each(&:freeze)
.
হিমায়িত স্ট্রিংস
পরিবর্তনযোগ্য বস্তুর কার্যক্ষমতার উপরও প্রভাব পড়ে, বিশেষ করে স্ট্রিং। কারণ হল একটি বড় প্রোগ্রামে একই স্ট্রিং একাধিকবার ব্যবহার করার একটি ভাল সুযোগ রয়েছে৷
৷
রুবি প্রতিটি স্ট্রিংয়ের জন্য একটি নতুন বস্তু তৈরি করবে, এমনকি যদি দুটি স্ট্রিং একই দেখায়, বা অন্য কথায়, তাদের একই 'সামগ্রী' থাকে। আপনি irb
এ এটি সহজেই দেখতে পাবেন আপনি যদি object_id
ব্যবহার করেন পদ্ধতি।
এখানে একটি উদাহরণ :
a = 'test' b = 'test' a.object_id # 76325640 b.object_id # 76317550
এটি একটি সমস্যা কারণ এই বস্তুগুলি অতিরিক্ত মেমরি এবং অতিরিক্ত CPU চক্র ব্যবহার করছে৷
আপনি যখন হিমায়িত স্ট্রিং ব্যবহার করেন তখন রুবি 2.1 দিয়ে শুরু , রুবি একই স্ট্রিং অবজেক্ট ব্যবহার করবে। এটি একই স্ট্রিংয়ের নতুন অনুলিপি তৈরি করতে এড়িয়ে যায়। যার ফলে কিছু স্মৃতি সঞ্চয় হয় এবং একটি ছোট কর্মক্ষমতা বৃদ্ধি পায়।
রেলগুলি বিস্তৃত করে এই কারণে হিমায়িত স্ট্রিং ব্যবহার. উদাহরণস্বরূপ, এই পিআরটি একবার দেখুন।
এটি রুবি ডেভেলপমেন্ট টিমকে স্ট্রিংগুলিকে অপরিবর্তনীয়-এ স্থানান্তরিত করার কথা বিবেচনা করতে প্ররোচিত করেছিল ডিফল্টরূপে বস্তু। প্রকৃতপক্ষে, রুবি 2.3, যা মাত্র কয়েকদিন আগে প্রকাশিত হয়েছে, এতে আপনার প্রকল্পের জন্য এটি সক্ষম করার দুটি উপায় রয়েছে৷
একটি হল # frozen_string_literal: true
অন্তর্ভুক্ত করা প্রতিটি ফাইলের শীর্ষে যেখানে আপনি স্ট্রিংগুলিকে অপরিবর্তনীয় হতে চান। এবং অন্যটি হল একটি কমান্ড-লাইন আর্গুমেন্ট --enable=frozen-string-literal
ব্যবহার করা .
ডিফল্টরূপে অপরিবর্তনীয় স্ট্রিংগুলি সম্ভবত রুবি 3.0 এ অবতরণ করবে৷
৷এখন পাগল হয়ে যাবেন না এবং আপনার অ্যাপে আপনার সমস্ত স্ট্রিং হিমায়িত করা শুরু করুন। আপনি শুধুমাত্র স্ট্রিংগুলির জন্য এটি করতে চান যা কিছু ধরণের সুবিধা দেখতে শত শত বার ব্যবহার করা হয় . এটি বলার পরে, এখানে একটি টুল রয়েছে যা আপনি হিমায়িত হওয়ার সম্ভাব্য স্ট্রিংগুলি খুঁজে পেতে ব্যবহার করতে পারেন৷
আপনার পদ্ধতি জানুন
একটি মিউটেবল অবজেক্টের সমস্ত পদ্ধতি বস্তুটিকে প্রকৃতপক্ষে পরিবর্তন করবে না, উদাহরণস্বরূপ, gsub পদ্ধতিটি একটি নতুন স্ট্রিং ফিরিয়ে দেবে, মূলটিকে অস্পর্শ করে রেখে৷
এই পদ্ধতিগুলির মধ্যে কয়েকটির একটি বিকল্প সংস্করণ আছে যা মূল বস্তুর জায়গায় পরিবর্তন করে, যা প্রায়শই আরও দক্ষ। এই পদ্ধতিগুলি প্রায়ই একটি বিস্ময়বোধক চিহ্ন !
দিয়ে শেষ হয় তাদের প্রভাব নির্দেশ করতে।
এই 'ব্যাং' পদ্ধতির দুটি উদাহরণ হল gsub!
এবং map!
.
এটি নোট করুন :
!
দিয়ে শেষ হওয়া একটি পদ্ধতি সর্বদা এর অর্থ এই নয় যে এটি একটি 'পদ্ধতি যা একটি বস্তুকে পরিবর্তন করে'।
আরো সাধারণ পরিভাষায়, !
চিহ্নটি 'বিপদ' বোঝাতে ব্যবহৃত হয়। একটি উদাহরণ এর মধ্যে exit!
পদ্ধতি, যা কোনো প্রস্থান হ্যান্ডলার উপেক্ষা করে অবিলম্বে প্রোগ্রাম থেকে প্রস্থান করবে।
এমনও পদ্ধতি রয়েছে যা বস্তু পরিবর্তন করে এবং !
দিয়ে শেষ হয় না প্রতীক যেমন:delete
, clear
, push
, concat
, এবং আরো অনেক।
র্যাপিং আপ
পরিবর্তনশীলতা একটি জটিল বিষয় হতে পারে, কিন্তু যেহেতু আপনি এই পোস্টটি পড়েছেন আপনি এখন এটি মোকাবেলা করার জন্য অনেক ভালোভাবে প্রস্তুত। রুবি ডকুমেন্টেশন চেক করুন যদি আপনি নিশ্চিত না হন যে একটি পদ্ধতি কি করছে, এটি আপনাকে সমস্যা এড়াতে সাহায্য করবে।
আমি আশা করি আপনি এই নিবন্ধটি তথ্যপূর্ণ পেয়েছেন, অনুগ্রহ করে শেয়ার করুন এটি আপনার বন্ধুদের সাথে যাতে তারা আনন্দ করতে পারে৷ এটা খুব. এছাড়াও নীচের আমার নিউজলেটারে যোগদান করুন যাতে এটি বের হওয়ার সময় আপনি এই ধরনের আরও সামগ্রী মিস করবেন না!