উত্তর:
টি এল; ডিআর:
তুলনা করার সময় প্রতীক ব্যবহার করা কেবল সময় সাশ্রয় করে না, স্মৃতিশক্তিও সঞ্চয় করে, কারণ সেগুলি কেবল একবারে সংরক্ষণ করা হয়।
রুবি প্রতীকগুলি অপরিবর্তনীয় (পরিবর্তন করা যায় না), যা কিছু সহজে দেখাতে সহজ করে তোলে
সংক্ষিপ্ত (ইশ) উত্তর:
তুলনা করার সময় প্রতীক ব্যবহার করা কেবল সময় সাশ্রয় করে না, স্মৃতিশক্তিও সঞ্চয় করে, কারণ সেগুলি কেবল একবারে সংরক্ষণ করা হয়।
রুবির প্রতীকগুলি মূলত "অপরিবর্তনীয় স্ট্রিংস" .. এর অর্থ হল যে সেগুলি পরিবর্তন করা যাবে না এবং এটি সূচিত করে যে একই উত্সটি যখন আপনার উত্স কোড জুড়ে বহুবার উল্লেখ করা হয়, সর্বদা একই সত্তা হিসাবে সঞ্চিত থাকে, উদাহরণস্বরূপ একই অবজেক্ট আইডি রয়েছে ।
অন্যদিকে স্ট্রিংগুলি পরিবর্তনযোগ্য , এগুলি যে কোনও সময় পরিবর্তন করা যেতে পারে। এর থেকে বোঝা যায় যে রুবিকে আপনার উত্স কোড জুড়ে উল্লিখিত প্রতিটি স্ট্রিংটিকে পৃথক সত্তায় সংরক্ষণ করতে হবে, উদাহরণস্বরূপ আপনার সোর্স কোডে যদি আপনার স্ট্রিং "নাম" একাধিকবার উল্লেখ থাকে, রুবিকে এই সমস্ত পৃথক স্ট্রিং অবজেক্টে সংরক্ষণ করতে হবে, কারণ তারা পরে পরিবর্তন হতে পারে (এটাই রুবি স্ট্রিংয়ের প্রকৃতি)।
যদি আপনি হ্যাশ কী হিসাবে একটি স্ট্রিং ব্যবহার করেন তবে রুবির স্ট্রিংটি মূল্যায়ন করতে হবে এবং এর বিষয়বস্তুগুলি দেখতে হবে (এবং এর উপর একটি হ্যাশ ফাংশন গণনা করতে হবে) এবং ইতিমধ্যে হ্যাশে সঞ্চিত কীগুলির (হ্যাশ) মানগুলির সাথে ফলাফলের তুলনা করতে হবে ।
আপনি যদি হ্যাশ কী হিসাবে প্রতীক ব্যবহার করেন, তবে তা বোঝা যায় যে এটি অপরিবর্তনীয়, সুতরাং রুবি মূলত কেবল (হ্যাশ) অবজেক্ট-আইডির (হ্যাশ) অবজেক্ট-আইডির বিপরীতে (হ্যাশ ফাংশন) অবজেক্ট-আইডির তুলনা করতে পারে যা ইতিমধ্যে সঞ্চিত রয়েছে in হ্যাশ (অনেক দ্রুত)
ডাউনসাইড: প্রতিটি প্রতীক রুবি ইন্টারপ্রেটারের প্রতীক-সারণীতে একটি স্লট গ্রাস করে, যা কখনই প্রকাশ হয় না। প্রতীকগুলি কখনই আবর্জনা-সংগ্রহ করা হয় না। সুতরাং একটি কোণার-কেসটি হ'ল যখন আপনার কাছে প্রচুর পরিমাণে চিহ্ন থাকে (যেমন স্বয়ংক্রিয়ভাবে উত্পন্ন উত্সগুলি)। সেক্ষেত্রে আপনার মূল্যায়ন করা উচিত কীভাবে এটি আপনার রুবি ইন্টারপ্রেটারের আকারকে প্রভাবিত করে।
মন্তব্য:
আপনি যদি স্ট্রিং তুলনা করেন তবে রুবি কেবল তাদের অবজেক্ট আইডির সাহায্যে চিহ্নগুলি মূল্যায়ন না করে তুলনা করতে পারবেন। স্ট্রিংগুলির তুলনায় এটি অনেক দ্রুত, যার মূল্যায়ন করা দরকার।
আপনি যদি কোনও হ্যাশ অ্যাক্সেস করেন তবে রুবি আপনি যে কোনও কী ব্যবহার করেন না কেন "হ্যাশ-কী" গণনা করতে সর্বদা একটি হ্যাশ-ফাংশন প্রয়োগ করে। আপনি MD5-hash এর মতো কিছু কল্পনা করতে পারেন। এবং তারপরে রুবি একে অপরের সাথে এই "হ্যাশ কীগুলি" তুলনা করে।
দীর্ঘ উত্তর:
স্ট্রিংয়ের একাধিক লাভের কারণটি দক্ষতা:
O(n)
স্ট্রিংসের জন্য এবং প্রতীকগুলির জন্য ধ্রুবক।তদ্ব্যতীত, রুবি ১.৯ কেবলমাত্র প্রতীক কী (যেমন h.merge(foo: 42, bar: 6)
) সহ হ্যাশের জন্য একটি সরলিকৃত বাক্য গঠন প্রবর্তন করেছে এবং রুবি ২.০ তে মূল শব্দ যুক্তি রয়েছে যা কেবলমাত্র প্রতীক কীগুলির জন্য কাজ করে।
দ্রষ্টব্য :
1) আপনি জানতে পেরে অবাক হতে পারেন যে রুবি String
অন্য যে কোনও ধরণের চেয়ে কীগুলি আলাদাভাবে আচরণ করে । প্রকৃতপক্ষে:
s = "foo"
h = {}
h[s] = "bar"
s.upcase!
h.rehash # must be called whenever a key changes!
h[s] # => nil, not "bar"
h.keys
h.keys.first.upcase! # => TypeError: can't modify frozen string
কেবল স্ট্রিং কীগুলির জন্য, রুবি অবজেক্টের পরিবর্তে হিমায়িত অনুলিপি ব্যবহার করবে।
২) "বি", "ক" এবং "আর" অক্ষরগুলি :bar
প্রোগ্রামে উপস্থিত সমস্ত ঘটনার জন্য কেবল একবার সংরক্ষণ করা হয় । রুবির ২.২-এর আগে, ক্রমাগত নতুন তৈরি করা খারাপ ধারণা Symbols
ছিল যা কখনও পুনরায় ব্যবহার করা হয়নি, কারণ তারা চিরকাল বিশ্বব্যাপী প্রতীক দেখার সারণীতে থাকবে। রুবি ২.২ এগুলি আবর্জনা সংগ্রহ করবে, তাই কোনও উদ্বেগ নেই।
3) আসলে, প্রতীকটির জন্য হ্যাশ গণনা করতে রুবি 1.8.x এ কোনও সময় নেয়নি, কারণ অবজেক্ট আইডি সরাসরি ব্যবহার করা হয়েছিল:
:bar.object_id == :bar.hash # => true in Ruby 1.8.7
রুবি ১.৯.x এ হ্যাশগুলি এক অধিবেশন থেকে অন্য সেশনে পরিবর্তিত হয়েছে (এর সাথে Symbols
):
:bar.hash # => some number that will be different next time Ruby 1.9 is ran
পুনরায়: স্ট্রিং ব্যবহার করে কী সুবিধা?
(খুব) সামান্য দ্রুত মান চেহারা আপস যেহেতু একটি প্রতীক হ্যাসিং একটি স্ট্রিং হ্যাশ বনাম একটি পূর্ণসংখ্যার হ্যাশিং সমতুল্য।
অসুবিধা: প্রোগ্রামের প্রতীক টেবিলের একটি স্লট গ্রহণ করে যা কখনই প্রকাশিত হয় না।
আমি রুবি ২.x-এ প্রবর্তিত হিমায়িত স্ট্রিং সম্পর্কিত ফলোআপে আগ্রহী
আপনি যখন কোনও পাঠ্য ইনপুট থেকে আগত অসংখ্য স্ট্রিং মোকাবেলা করেন (উদাহরণস্বরূপ, র্যাকের মাধ্যমে আমি এইচটিটিপি প্যারামগুলি বা পে-লোডের কথা ভাবছি), সর্বত্র স্ট্রিংগুলি ব্যবহার করা সহজ।
আপনি যখন তাদের কয়েকজনের সাথে ডিল করেন তবে সেগুলি কখনই পরিবর্তিত হয় না (যদি তারা আপনার ব্যবসাটি "শব্দভাণ্ডার" হয়) তবে আমি ভাবতে চাই যে এগুলি হিমিয়ে ফেলতে পারে কোনও পার্থক্য। আমি এখনও কোনও মানদণ্ড সম্পন্ন করিনি, তবে আমার ধারণা এটি প্রতীকগুলির কার্যকারিতাটি নিকটবর্তী হবে।