কেন রুবিতে হ্যাশ কী হিসাবে প্রতীক ব্যবহার করবেন?


161

রুবি হ্যাশটিতে লোকেরা কী হিসাবে প্রতীকগুলি ব্যবহার করে।

স্ট্রিং ব্যবহার করে কী সুবিধা?

উদাহরণ:

hash[:name]

বনাম

hash['name']

উত্তর:


226

টি এল; ডিআর:

তুলনা করার সময় প্রতীক ব্যবহার করা কেবল সময় সাশ্রয় করে না, স্মৃতিশক্তিও সঞ্চয় করে, কারণ সেগুলি কেবল একবারে সংরক্ষণ করা হয়।

রুবি প্রতীকগুলি অপরিবর্তনীয় (পরিবর্তন করা যায় না), যা কিছু সহজে দেখাতে সহজ করে তোলে

সংক্ষিপ্ত (ইশ) উত্তর:

তুলনা করার সময় প্রতীক ব্যবহার করা কেবল সময় সাশ্রয় করে না, স্মৃতিশক্তিও সঞ্চয় করে, কারণ সেগুলি কেবল একবারে সংরক্ষণ করা হয়।

রুবির প্রতীকগুলি মূলত "অপরিবর্তনীয় স্ট্রিংস" .. এর অর্থ হল যে সেগুলি পরিবর্তন করা যাবে না এবং এটি সূচিত করে যে একই উত্সটি যখন আপনার উত্স কোড জুড়ে বহুবার উল্লেখ করা হয়, সর্বদা একই সত্তা হিসাবে সঞ্চিত থাকে, উদাহরণস্বরূপ একই অবজেক্ট আইডি রয়েছে ।

অন্যদিকে স্ট্রিংগুলি পরিবর্তনযোগ্য , এগুলি যে কোনও সময় পরিবর্তন করা যেতে পারে। এর থেকে বোঝা যায় যে রুবিকে আপনার উত্স কোড জুড়ে উল্লিখিত প্রতিটি স্ট্রিংটিকে পৃথক সত্তায় সংরক্ষণ করতে হবে, উদাহরণস্বরূপ আপনার সোর্স কোডে যদি আপনার স্ট্রিং "নাম" একাধিকবার উল্লেখ থাকে, রুবিকে এই সমস্ত পৃথক স্ট্রিং অবজেক্টে সংরক্ষণ করতে হবে, কারণ তারা পরে পরিবর্তন হতে পারে (এটাই রুবি স্ট্রিংয়ের প্রকৃতি)।

যদি আপনি হ্যাশ কী হিসাবে একটি স্ট্রিং ব্যবহার করেন তবে রুবির স্ট্রিংটি মূল্যায়ন করতে হবে এবং এর বিষয়বস্তুগুলি দেখতে হবে (এবং এর উপর একটি হ্যাশ ফাংশন গণনা করতে হবে) এবং ইতিমধ্যে হ্যাশে সঞ্চিত কীগুলির (হ্যাশ) মানগুলির সাথে ফলাফলের তুলনা করতে হবে ।

আপনি যদি হ্যাশ কী হিসাবে প্রতীক ব্যবহার করেন, তবে তা বোঝা যায় যে এটি অপরিবর্তনীয়, সুতরাং রুবি মূলত কেবল (হ্যাশ) অবজেক্ট-আইডির (হ্যাশ) অবজেক্ট-আইডির বিপরীতে (হ্যাশ ফাংশন) অবজেক্ট-আইডির তুলনা করতে পারে যা ইতিমধ্যে সঞ্চিত রয়েছে in হ্যাশ (অনেক দ্রুত)

ডাউনসাইড: প্রতিটি প্রতীক রুবি ইন্টারপ্রেটারের প্রতীক-সারণীতে একটি স্লট গ্রাস করে, যা কখনই প্রকাশ হয় না। প্রতীকগুলি কখনই আবর্জনা-সংগ্রহ করা হয় না। সুতরাং একটি কোণার-কেসটি হ'ল যখন আপনার কাছে প্রচুর পরিমাণে চিহ্ন থাকে (যেমন স্বয়ংক্রিয়ভাবে উত্পন্ন উত্সগুলি)। সেক্ষেত্রে আপনার মূল্যায়ন করা উচিত কীভাবে এটি আপনার রুবি ইন্টারপ্রেটারের আকারকে প্রভাবিত করে।

মন্তব্য:

আপনি যদি স্ট্রিং তুলনা করেন তবে রুবি কেবল তাদের অবজেক্ট আইডির সাহায্যে চিহ্নগুলি মূল্যায়ন না করে তুলনা করতে পারবেন। স্ট্রিংগুলির তুলনায় এটি অনেক দ্রুত, যার মূল্যায়ন করা দরকার।

আপনি যদি কোনও হ্যাশ অ্যাক্সেস করেন তবে রুবি আপনি যে কোনও কী ব্যবহার করেন না কেন "হ্যাশ-কী" গণনা করতে সর্বদা একটি হ্যাশ-ফাংশন প্রয়োগ করে। আপনি MD5-hash এর মতো কিছু কল্পনা করতে পারেন। এবং তারপরে রুবি একে অপরের সাথে এই "হ্যাশ কীগুলি" তুলনা করে।

দীর্ঘ উত্তর:

https://web.archive.org/web/20180709094450/http://www.reactive.io/tips/2009/01/11/the-difference-between-ruby-symbols-and-strings

http://www.randomhacks.net.s3-website-us-east-1.amazonaws.com/2007/01/20/13-ways-of-looking-at-a-ruby-symbol/


5
ফবি, প্রতীকগুলি রুবির পরবর্তী সংস্করণে জিসিডি হবে: বাগস.আরবি-lang.org/issues/9634
আজেদি 32

2
এছাড়াও, রুবিতে হ্যাশ কী হিসাবে ব্যবহার করা হলে স্ট্রিংগুলি স্বয়ংক্রিয়ভাবে হিমশীতল হয়। সুতরাং এটি ঠিক সত্য নয় যে স্ট্রিংসগুলি এই প্রসঙ্গে তাদের সম্পর্কে কথা বলার সময় পরিবর্তনযোগ্য।
আজেদি 32

1
"দীর্ঘ উত্তর" বিভাগের বিষয়ে শীর্ষস্থান এবং প্রথম লিঙ্কটি সরানো বা স্থানান্তরিত করা হয়েছে।
Hbksagar

2
প্রতীকগুলি রুবি ২.২
-

2
দুর্দান্ত উত্তর! ট্রোলিংয়ের দিক থেকে আপনার "সংক্ষিপ্ত উত্তর" যথেষ্ট দীর্ঘ। ;)
টেকনোফাইল

22

স্ট্রিংয়ের একাধিক লাভের কারণটি দক্ষতা:

  1. প্রতীকগুলি অপরিবর্তনীয়, তাই প্রশ্ন "কী পরিবর্তন হলে কী হয়?" জিজ্ঞাসা করার দরকার নেই।
  2. স্ট্রিংগুলি আপনার কোডটিতে নকল হয়েছে এবং সাধারণত মেমরিতে আরও স্থান নেবে।
  3. তাদের তুলনা করতে হ্যাশ লুকআপগুলিকে অবশ্যই কীগুলির হ্যাশ গণনা করতে হবে। এটি 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

আপনার দুর্দান্ত নোটের জন্য +1! আমি মূলত আমার উত্তরে হ্যাশ ফাংশনটি উল্লেখ করিনি, কারণ আমি এটি পড়া সহজ করার চেষ্টা করেছি :)
টিলো

@ টিলো: প্রকৃতপক্ষে, তাই আমি আমার উত্তরটি লিখেছিলাম :-) আমি রুবি ১.৯-এর বিশেষ বাক্য গঠন এবং রুবি ২.০ এর প্রতিশ্রুতিযুক্ত প্যারামিটারগুলি উল্লেখ করার জন্য আমার উত্তরটি সম্পাদনা করেছি
মার্ক-অ্যান্ড্রে লাফোর্টুন

আপনি কী ব্যাখ্যা করতে পারবেন যে স্ট্রিংয়ের জন্য কীভাবে হ্যাশ লুক্কুলগুলি সিম্বলস এবং ও (এন) এর জন্য ধ্রুবক?
আসাদ মুসভি

7

পুনরায়: স্ট্রিং ব্যবহার করে কী সুবিধা?

  • স্টাইলিং: এটি রুবি-ওয়ে
  • (খুব) সামান্য দ্রুত মান চেহারা আপস যেহেতু একটি প্রতীক হ্যাসিং একটি স্ট্রিং হ্যাশ বনাম একটি পূর্ণসংখ্যার হ্যাশিং সমতুল্য।

  • অসুবিধা: প্রোগ্রামের প্রতীক টেবিলের একটি স্লট গ্রহণ করে যা কখনই প্রকাশিত হয় না।


4
+1 উল্লেখ করার জন্য যে প্রতীকটি কখনও আবর্জনা সংগ্রহ করে না।
ভোর্টিকো

প্রতীকটি কখনই আবর্জনা সংগ্রহ করা হয় না - রুবি ২.২++ থেকে সত্য নয়
ইডাইমোনিয়া

0

আমি রুবি ২.x-এ প্রবর্তিত হিমায়িত স্ট্রিং সম্পর্কিত ফলোআপে আগ্রহী

আপনি যখন কোনও পাঠ্য ইনপুট থেকে আগত অসংখ্য স্ট্রিং মোকাবেলা করেন (উদাহরণস্বরূপ, র্যাকের মাধ্যমে আমি এইচটিটিপি প্যারামগুলি বা পে-লোডের কথা ভাবছি), সর্বত্র স্ট্রিংগুলি ব্যবহার করা সহজ।

আপনি যখন তাদের কয়েকজনের সাথে ডিল করেন তবে সেগুলি কখনই পরিবর্তিত হয় না (যদি তারা আপনার ব্যবসাটি "শব্দভাণ্ডার" হয়) তবে আমি ভাবতে চাই যে এগুলি হিমিয়ে ফেলতে পারে কোনও পার্থক্য। আমি এখনও কোনও মানদণ্ড সম্পন্ন করিনি, তবে আমার ধারণা এটি প্রতীকগুলির কার্যকারিতাটি নিকটবর্তী হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.