কিভাবে রুবি প্রতীক বুঝতে হয়


85

" রুবি সিম্বল বোঝা " পড়া সত্ত্বেও , সিম্বলগুলি ব্যবহার করার ক্ষেত্রে আমি যখনই মেমোরিতে ডেটা উপস্থাপন করে তখনও বিভ্রান্ত হয়ে পড়েছি। যদি একটি প্রতীক, তাদের মধ্যে দুটি আলাদা আলাদা বস্তুতে অন্তর্ভুক্ত থাকে, একই মেমোরি অবস্থানের মধ্যে উপস্থিত থাকে, তবে কীভাবে তাদের আলাদা মান রয়েছে? আমি একই মান ধারণ করার জন্য একই মেমরির অবস্থানটি আশা করতাম।

এই লিঙ্কটি থেকে একটি উদ্ধৃতি:

স্ট্রিংয়ের বিপরীতে, একই নামের প্রতীকগুলি আরবি করা হয় এবং রুবির সেশনে একবারেই স্মৃতিতে উপস্থিত থাকে

আমি বুঝতে পারি না কীভাবে এটি একই মেমরির অবস্থানটিতে থাকা মানগুলিকে আলাদা করতে পরিচালিত করে।

এই উদাহরণ বিবেচনা করুন:

patient1 = { :ruby => "red" }
patient2 = { :ruby => "programming" }

patient1.each_key {|key| puts key.object_id.to_s}
3918094
patient2.each_key {|key| puts key.object_id.to_s}
3918094

patient1এবং patient2উভয় হ্যাশ, এটা ঠিক আছে। :rubyতবে একটি প্রতীক। আমরা যদি নিম্নলিখিতগুলি আউটপুট করে থাকি:

patient1.each_key {|key| puts key.to_s}

তাহলে আউটপুট কী হবে? "red", বা "programming"?

এক সেকেন্ডের জন্য হ্যাশগুলি ভুলে যাওয়া, আমি ভাবছি প্রতীকটি কোনও মানের একটি পয়েন্টার । আমার যে প্রশ্নগুলি রয়েছে তা হ'ল:

  • আমি কি একটি চিহ্ন একটি মান বরাদ্দ করতে পারি?
  • প্রতীক কি কোনও ভেরিয়েবলের সাথে এর মান সহ কেবল একটি পয়েন্টার?
  • যদি চিহ্নগুলি বিশ্বব্যাপী হয়, তবে এর অর্থ কি একটি চিহ্ন সর্বদা একটি জিনিসকে নির্দেশ করে?

4
এটি ": রুবি" আউটপুট দেবে, কারণ আপনি একটি প্রতীক মুদ্রণ করছেন। আপনি যদি বলেন puts patient1[:ruby], এটি "লাল" মুদ্রণ করবে, আপনি যদি বলেন puts patient2[:ruby], এটি "প্রোগ্রামিং" মুদ্রণ করবে।
ROSS

4
একটি চিহ্ন একটি মান একটি পয়েন্টার নয়। অভ্যন্তরীণভাবে একটি চিহ্ন কেবল একটি পূর্ণসংখ্যা।
akuhn

উত্তর:


62

এই বিবেচনা:

x = :sym
y = :sym
(x.__id__ == y.__id__ ) && ( :sym.__id__ == x.__id__) # => true

x = "string"
y = "string"
(x.__id__ == y.__id__ ) || ( "string".__id__ == x.__id__) # => false

সুতরাং, তবে আপনি একটি প্রতীক অবজেক্ট তৈরি করেন, যতক্ষণ না এর বিষয়বস্তু একই থাকে, এটি মেমরিতে একই অবজেক্টকে উল্লেখ করবে। এটি কোনও সমস্যা নয় কারণ প্রতীক একটি অপরিবর্তনীয় বস্তু । স্ট্রিংগুলি পরিবর্তনীয়।


(নীচের মন্তব্যের জবাবে)

মূল নিবন্ধে, মান একটি প্রতীক মধ্যে সংরক্ষণ করা হচ্ছে না, এটি একটি হ্যাশ মধ্যে সংরক্ষণ করা হচ্ছে। এই বিবেচনা:

hash1 = { "string" => "value"}
hash2 = { "string" => "value"}

এটি মেমরিতে ছয়টি অবজেক্ট তৈরি করে - চারটি স্ট্রিং অবজেক্ট এবং দুটি হ্যাশ অবজেক্ট।

hash1 = { :symbol => "value"}
hash2 = { :symbol => "value"}

এটি কেবল স্মৃতিতে পাঁচটি বস্তু তৈরি করে - একটি প্রতীক, দুটি স্ট্রিং এবং দুটি হ্যাশ অবজেক্ট।


লিঙ্কটির উদাহরণটি, যদিও বিভিন্ন মান সহ প্রতীক দেখায় তবে প্রতীকটির একই নাম এবং একই মেমরির অবস্থান রয়েছে। যখন তারা আউটপুট হয়, তাদের আলাদা আলাদা মান থাকে, এটাই আমি পাই না। অবশ্যই তাদের একই মান থাকা উচিত?
কেজ্জার

4
আমি কীভাবে এখনও বিভ্রান্ত হয়েছি তা চেষ্টা করার জন্য এবং একটি সম্পাদনা করেছি। আমার মস্তিষ্ক গণনা করতে পারে না;)
কেজ্জার

48
প্রতীক মান থাকে না, তারা হয় মান। হ্যাশগুলিতে মান রয়েছে।
ম্লাদেন জাবলানোভিć

6
এটি Hash(আপনার কোডটিতে {... => ... by দ্বারা তৈরি) যা কী / মান জোড়া সঞ্চয় করে, Symbolনিজেরাই নয়। Symbolগুলি (উদাঃ :symbolবা :symবা :ruby) জোড়ায় জোড়ায় চাবি রয়েছে। কেবল একটি অংশ হিসাবে Hashতারা কোনও কিছুর প্রতি "নির্দেশ" করে।
জেমস এ রোজেন

4
প্রতীকটি হ্যাশটির মূল হিসাবে কী হিসাবে ব্যবহৃত হচ্ছে, এ কারণেই সেগুলি পৃথক হতে পারে, এটি কী 1 = 'রুবি' এবং হ্যাশ 1 = {কী 1 => 'মান' বলার সাথে অনুরূপ ...} হ্যাশ 2 = { কী 1 => 'মান 2' ...}}
জোশুয়া ওলসন

53

আমি যখন এটির মতো চিন্তা করেছিলাম তখন আমি প্রতীকগুলি ভাঙ্গতে সক্ষম হয়েছি। রুবি স্ট্রিং এমন একটি অবজেক্ট যার মধ্যে প্রচুর পদ্ধতি এবং বৈশিষ্ট্য রয়েছে। লোকেরা কীগুলির জন্য স্ট্রিং ব্যবহার করতে পছন্দ করে এবং যখন কোনও কীটির জন্য স্ট্রিংটি ব্যবহার করা হয় তখন সমস্ত অতিরিক্ত পদ্ধতি ব্যবহার করা হয় না। সুতরাং তারা চিহ্ন তৈরি করেছে, যা সরানো সমস্ত কার্যকারিতা সহ স্ট্রিং অবজেক্টস, এটির জন্য একটি ভাল কী হওয়ার জন্য প্রয়োজনীয় except

প্রতীকটিকে কেবল ধ্রুবক স্ট্রিং হিসাবে মনে করুন


4
পোস্টগুলির মাধ্যমে পড়া, এটি সম্ভবত আমার পক্ষে সবচেয়ে বেশি অর্থবোধ করে। : রুবি সবেমাত্র স্মৃতিতে কোথাও সঞ্চিত থাকে, যদি আমি কোথাও "রুবি" ব্যবহার করি, তবে "রুবি" আবার কোথাও আবার ব্যবহার করা হয়েছে, এটি কেবল নকল। সুতরাং প্রতীক ব্যবহার করা সাধারণ তথ্যের সদৃশতা হ্রাস করার একটি উপায়। আপনি যেমনটি বলেন, ধ্রুব স্ট্রিং। আমার ধারণা এমন কিছু অন্তর্নিহিত প্রক্রিয়া আছে যা ব্যবহার করে সেই প্রতীকটি আবার খুঁজে পাবে?
কেজ্জার

4
@ কেজ্জার এই উত্তরটি সত্যিই ভাল এবং আমার কাছে সঠিক বলে মনে হচ্ছে, তবে আপনার মন্তব্যটি কিছু আলাদা বলেছে এবং ভুল বা বিভ্রান্তিকর, আপনার মন্তব্যটি স্ট্রিং সহ ডেটারের নকলের কথা বলে, এবং এটি প্রতীকগুলির কারণ, এটি ভুল বা বিভ্রান্তিকর using আপনি ব্যবহার করছেন প্রতীকটি একাধিকবার বেশি মেমরির স্থান ব্যবহার করবে না, তবে আপনার কাছে স্ট্রিংগুলির জন্য অনেকগুলি ভাষায় থাকতে পারে যেমন কিছু প্রোগ্রামিং ভাষা যদি আপনি "abc" লিখেন এবং অন্য কোথাও "abc" সংকলকটি দেখতে পান এটি একই মানের স্ট্রিংটি সঞ্চয় করে এবং সংরক্ষণ করে একই জায়গায় এটি একই বস্তু তৈরি করে, তাকে বলা হয় স্ট্রিং ইন্টার্নিং এবং সি # এটি করে।
বার্লপ

সুতরাং এটি মূলত একটি স্ট্রিংয়ের অবিশ্বাস্যভাবে হালকা ওজনের সংস্করণ?
স্টিভেক

34

প্রতীকটি :rubyধারণ করে না "red"বা "programming"। প্রতীক :rubyমাত্র প্রতীক :ruby। এটি আপনার হ্যাশগুলি patient1এবং patient2প্রতিটি ক্ষেত্রে একই কী দ্বারা চিহ্নিত প্রতিটি ক্ষেত্রে সেই মানগুলি থাকে।

এটি এইভাবে চিন্তা করুন: আপনি যদি ক্রিসমাস সকালে লিভিংরুমে যান, এবং তার উপর একটি ট্যাগ সহ দুটি বাক্স দেখুন যা তাদের উপর "কেজার" বলে say এটিতে মোজা রয়েছে এবং অন্যটির কয়লা রয়েছে। আপনি বিভ্রান্ত হয়ে যাবেন না এবং জিজ্ঞাসা করবেন না যে "কেজার" কীভাবে মোজা এবং কয়লা উভয়ই রাখতে পারে, যদিও এটি একই নাম। কারণ নামটিতে (ক্রপী) উপহার নেই। এটি কেবল তাদের দিকে ইঙ্গিত করছে। একইভাবে, :rubyআপনার হ্যাশের মানগুলি ধারণ করে না, এটি কেবল তাদের দিকে নির্দেশ করে।


4
এই উত্তরটি পুরো অর্থবোধ করে।
ভাস

এটি হ্যাশ এবং চিহ্নগুলির মোট মিশ্রণের মতো শোনাচ্ছে। একটি প্রতীক একটি মানকে নির্দেশ করে না, যদি আপনি বলতে চান এটি একটি হ্যাশের মধ্যে রয়েছে তখন, ভাল, এটি তর্কযোগ্য হতে পারে, তবে একটি প্রতীক হ্যাশে থাকতে হবে না। আপনি বলতে পারেন mystring = :steveT প্রতীকটি কোনও কিছুর দিকে ইঙ্গিত করে না। হ্যাশের একটি কী এর সাথে সম্পর্কিত মান রয়েছে এবং কীটি একটি প্রতীক হতে পারে। তবে একটি চিহ্ন একটি হ্যাশ মধ্যে থাকা প্রয়োজন।
বার্লপ

27

আপনি ধরেই নিতে পারেন যে আপনি যে ঘোষণাপত্রটি করেছেন তা সিম্বলটির মানটি যা কিছু তা ছাড়া অন্য কিছু হতে সংজ্ঞায়িত করে। আসলে, একটি প্রতীক হ'ল একটি "অভ্যন্তরীণ" স্ট্রিং মান যা স্থির থাকে। এগুলি কারণ তারা একটি সাধারণ পূর্ণসংখ্যার শনাক্তকারী ব্যবহার করে সংরক্ষণ করা হয় যে তারা প্রায়শই ব্যবহৃত হয় কারণ প্রচুর পরিমাণে ভেরিয়েবল-দৈর্ঘ্যের স্ট্রিং পরিচালনা করার চেয়ে দক্ষ।

আপনার উদাহরণের ক্ষেত্রে নিন:

patient1 = { :ruby => "red" }

এটি এই হিসাবে পড়তে হবে: "একটি পরিবর্তনশীল রোগী 1 ঘোষণা করুন এবং এটি একটি হ্যাশ হিসাবে সংজ্ঞায়িত করুন, এবং এই স্টোরটিতে মূল (লাল 'চিহ্ন) এর নীচে' লাল 'হবে"

এটি লেখার আর একটি উপায় হ'ল:

patient1 = Hash.new
patient1[:ruby] = 'red'

puts patient1[:ruby]
# 'red'

আপনি যখন কোনও অ্যাসাইনমেন্ট তৈরি করছেন এটি খুব কমই আশ্চর্যজনক যে আপনি যে ফলাফলটি ফিরে পেয়েছেন তা প্রথম স্থানে আপনি যেটি দিয়েছিলেন তার অনুরূপ।

সিম্বল ধারণাটি কিছুটা বিভ্রান্ত হতে পারে কারণ এটি অন্যান্য বেশিরভাগ ভাষার বৈশিষ্ট্য নয় not

মানগুলি অভিন্ন হলেও প্রতিটি স্ট্রিং অবজেক্ট স্বতন্ত্র:

[ "foo", "foo", "foo", "bar", "bar", "bar" ].each do |v|
  puts v.inspect + ' ' + v.object_id.to_s
end

# "foo" 2148099960
# "foo" 2148099940
# "foo" 2148099920
# "bar" 2148099900
# "bar" 2148099880
# "bar" 2148099860

একই মানযুক্ত প্রতিটি প্রতীক একই বস্তুকে বোঝায়:

[ :foo, :foo, :foo, :bar, :bar, :bar ].each do |v|
  puts v.inspect + ' ' + v.object_id.to_s
end

# :foo 228508
# :foo 228508
# :foo 228508
# :bar 228668
# :bar 228668
# :bar 228668

স্ট্রিংগুলিকে চিহ্নগুলিতে রূপান্তর করা একই অনন্য প্রতীকটিতে অভিন্ন মানচিত্রকে মানচিত্র করে:

[ "foo", "foo", "foo", "bar", "bar", "bar" ].each do |v|
  v = v.to_sym
  puts v.inspect + ' ' + v.object_id.to_s
end

# :foo 228508
# :foo 228508
# :foo 228508
# :bar 228668
# :bar 228668
# :bar 228668

তেমনি, প্রতীক থেকে স্ট্রিংয়ে রূপান্তর প্রতিটি সময় একটি পৃথক স্ট্রিং তৈরি করে:

[ :foo, :foo, :foo, :bar, :bar, :bar ].each do |v|
  v = v.to_s
  puts v.inspect + ' ' + v.object_id.to_s
end

# "foo" 2148097820
# "foo" 2148097700
# "foo" 2148097580
# "bar" 2148097460
# "bar" 2148097340
# "bar" 2148097220

অভ্যন্তরীণ হ্যাশ টেবিল থেকে প্রতীক মানগুলি আঁকা হিসাবে আপনি ভাবতে পারেন এবং একটি সহজ পদ্ধতি কল ব্যবহার করে সিম্বলগুলিতে এনকোড করা সমস্ত মান দেখতে পারেন:

Symbol.all_values

# => [:RUBY_PATCHLEVEL, :vi_editing_mode, :Separator, :TkLSHFT, :one?, :setuid?, :auto_indent_mode, :setregid, :back, :Fail, :RET, :member?, :TkOp, :AP_NAME, :readbyte, :suspend_context, :oct, :store, :WNOHANG, :@seek, :autoload, :rest, :IN_INPUT, :close_read, :type, :filename_quote_characters=, ...

আপনি কোলন-স্বরলিপি দ্বারা বা .to_sym ব্যবহার করে নতুন চিহ্নগুলি সংজ্ঞায়িত করার সাথে সাথে এই টেবিলটি বাড়বে।


18

প্রতীকগুলি পয়েন্টার নয়। এগুলিতে মান থাকে না। প্রতীকগুলি সহজভাবে হয়:rubyএটিই প্রতীক :rubyএবং এর মধ্যে এটিই রয়েছে। এটা একটা মান থাকা না, এটা না না কিছু, এটা ঠিক প্রতীক হিসেবে বিদ্যমান :ruby। প্রতীকটি :ruby1 নম্বরর মতোই একটি মান। এটি সংখ্যা 1 এর চেয়ে বেশি আর কোনও মানকে নির্দেশ করে না।


13
patient1.each_key {|key| puts key.to_s}

তাহলে আউটপুট কী হবে? "লাল", বা "প্রোগ্রামিং"?

না হয়, এটি "রুবি" আউটপুট দেবে।

আপনি বিভ্রান্তিকর প্রতীক এবং হ্যাশ এগুলি সম্পর্কিত নয়, তবে তারা একসাথে দরকারী। প্রশ্নে প্রতীকটি হ'ল :ruby; হ্যাশের মানগুলির সাথে এটির কোনও সম্পর্ক নেই এবং এটি অভ্যন্তরীণ পূর্ণসংখ্যার প্রতিনিধিত্ব সবসময় একই হবে এবং এটি "মান" (যখন স্ট্রিংয়ে রূপান্তরিত হয়) সর্বদা "রুবি" হবে।


11

সংক্ষেপে

প্রতীকগুলি মানব পাঠযোগ্য, অপরিবর্তনীয় উপস্থাপনা তৈরির সমস্যার সমাধান করে যা স্ট্রিংয়ের চেয়ে রানটাইম সন্ধানের জন্য সহজ হওয়ার সুবিধাও রয়েছে। এটিকে এমন কোনও নাম বা লেবেলের মতো ভাবুন যা পুনরায় ব্যবহার করা যেতে পারে।

কেন: লাল "লাল" এর চেয়ে ভাল

গতিশীল অবজেক্ট ওরিয়েন্টেড ল্যাঙ্গুয়েজে আপনি পাঠযোগ্য রেফারেন্স সহ জটিল, নেস্টেড ডেটা স্ট্রাকচার তৈরি করেন create হ্যাশ একটি সাধারণ ব্যবহারের ক্ষেত্রে দেখা যায় অনন্য, অন্তত, প্রতিটি ক্ষেত্রটিকেই - যেখানে আপনি অনন্য কীগুলিকে মান মানচিত্র। আপনার প্রতি হ্যাশে একাধিক "লাল" কী থাকতে পারে না।

তবে স্ট্রিং কীগুলির পরিবর্তে সংখ্যাসূচক সূচকটি ব্যবহার করা আরও প্রসেসরের দক্ষ হবে। সুতরাং গতি এবং পাঠযোগ্যতার মধ্যে একটি আপস হিসাবে প্রতীকগুলি চালু হয়েছিল। সমতুল্য স্ট্রিংয়ের চেয়ে প্রতীকগুলি আরও সহজ সমাধান করে। মানব পাঠযোগ্য এবং প্রতীকগুলি সমাধানের জন্য রানটাইমের পক্ষে সহজ হয়ে যাওয়া একটি গতিশীল ভাষার একটি আদর্শ সংযোজন।

উপকারিতা

প্রতীকগুলি অপরিবর্তনীয় হওয়ায় এগুলি রানটাইম জুড়ে ভাগ করা যায়। দুটি হ্যাশ উদাহরণগুলির মধ্যে যদি একটি লাল আইটেমটির জন্য একটি সাধারণ শব্দকোষ বা শব্দার্থগত প্রয়োজন থাকে তবে প্রতীক: লাল প্রায় অর্ধেক মেমরি ব্যবহার করে যে দুটি রেখার জন্য "লাল" স্ট্রিংয়ের প্রয়োজন হবে।

যেহেতু: লাল সবসময় মেমরির একই স্থানে ফিরে আসে আবার একশ হ্যাশ উদাহরণগুলিতে মেমরির প্রায় বৃদ্ধি না করে পুনরায় ব্যবহার করা যেতে পারে, যদিও "লাল" ব্যবহার করে একটি মেমরির ব্যয় যুক্ত হবে যেহেতু প্রতিটি হ্যাশ উদাহরণে পারস্পরিক পরিবর্তনশীল স্ট্রিং সংরক্ষণ করতে হবে সৃষ্টি।

নিশ্চিত নয় যে রুবি আসলে কীভাবে প্রতীক / স্ট্রিং প্রয়োগ করে তবে স্পষ্টভাবে একটি প্রতীক রানটাইমটিতে কম প্রয়োগের ওভারহেড সরবরাহ করে কারণ এটি একটি নির্দিষ্ট প্রতিনিধিত্ব করে। প্লাস চিহ্নগুলি একটি উদ্ধৃত স্ট্রিংয়ের চেয়ে টাইপ করতে আরও কম চরিত্র গ্রহণ করে এবং কম টাইপিং হ'ল সত্য রুবিবাদীদের অনন্ত সাধনা।

সারসংক্ষেপ

স্ট্রিং তুলনা ক্রিয়াকলাপের ব্যয় এবং প্রতিটি স্ট্রিং উদাহরণ মেমোরিতে সংরক্ষণের প্রয়োজনের কারণে কম চিহ্নের সাথে স্ট্রিং উপস্থাপনের পাঠযোগ্যতা পাবেন: লাল হিসাবে a


4

আমি হ্যাশ টেবিলগুলিতে উইকিপিডিয়া নিবন্ধটি পড়ার পরামর্শ দেব - আমার মনে হয় এটি {:ruby => "red"}সত্যিকারের অর্থ বোঝার জন্য আপনাকে সহায়তা করবে ।

আরেকটি অনুশীলন যা আপনার পরিস্থিতি বুঝতে সহায়তা করতে পারে: বিবেচনা করুন {1 => "red"}। শব্দার্থকভাবে, এর অর্থ "এর মান সেট 1করা "red"" নয়, যা রুবিতে অসম্ভব। বরং এটির অর্থ হ্যাশ অবজেক্ট তৈরি করা এবং "red"কীটির জন্য মান সংরক্ষণ করা 1


3
patient1 = { :ruby => "red" }
patient2 = { :ruby => "programming" }

patient1.each_key {|key| puts key.object_id.to_s}
3918094
patient2.each_key {|key| puts key.object_id.to_s}
3918094

patient1এবং patient2উভয় হ্যাশ, এটা ঠিক আছে। :rubyতবে একটি প্রতীক। আমরা যদি নিম্নলিখিতগুলি আউটপুট করে থাকি:

patient1.each_key {|key| puts key.to_s}

তাহলে আউটপুট কী হবে? "লাল", বা "প্রোগ্রামিং"?

না, অবশ্যই। আউটপুট হবেruby । কোনটি, বিটিডাব্লু, আপনি কেবল এটির পরিবর্তে আইআরবিতে টাইপ করে প্রশ্ন টাইপ করার চেয়ে কম সময়ে খুঁজে পেতে পারেন।

কেন হবে এটা হতে redবা programming? প্রতীকগুলি সর্বদা নিজেরাই মূল্যায়ন করে। প্রতীকের মানটি :rubyপ্রতীক :rubyনিজেই এবং চিহ্নটির স্ট্রিং প্রতিনিধিত্ব :rubyস্ট্রিংয়ের মান"ruby"

[বিটিডাব্লু: putsসর্বদা তার আর্গুমেন্টগুলিকে স্ট্রিংয়ে রূপান্তরিত করে, যাইহোক। to_sএটির কল করার দরকার নেই ]]


আমার বর্তমান মেশিনে আইআরবি নেই, আমি কেন এটি ইনস্টল করতে সক্ষম হব না, তাই এর জন্য আমার ক্ষমা চাই।
কেজ্জার

4
@ কেজ্জার: কোন উদ্বেগ নেই, আমি কেবল কৌতূহলী ছিলাম। কখনও কখনও আপনি একটি সমস্যার মধ্যে নিজেকে এত গভীরভাবে কবর দেয় যে আপনি এমনকি সহজ জিনিস এমনকি দেখতে পারবেন না। আমি যখন মূলত আপনার প্রশ্নটি আইআরবিতে কাটা ও আটকালাম তখন আমি কেবলই অবাক হয়েছি: "সে নিজে কেন তা করেনি?" এবং উদ্বিগ্ন হবেন না, আপনি প্রথম নন (আপনি শেষও হবেন না) যখন উত্তরটি "কেবল এটি চালান!" যখন "এই প্রিন্টটি কী" জিজ্ঞাসা করে? বিটিডাব্লু: এখানে আপনার তাত্ক্ষণিক আইআরবি, যে কোনও জায়গায়, যে কোনও সময়, কোনও ইনস্টলেশনের প্রয়োজন নেই: ট্রাইরবি.আরগ বা রুবি-ভার্সন.নেট আপনাকে এমআরআই-এর সর্বদা সংস্করণে প্রকাশিত + ইয়ারভি + জেবি + রুবিনিয়াস + আরইইএস-এর সমস্ত সংস্করণে এসএসএইচ অ্যাক্সেস দেয়।
জার্গ ডব্লু মিত্তাগ

ধন্যবাদ, এখন এটিকে নিয়ে এখনই খেলছি। আমি এখনও কিছুটা বিভ্রান্ত হয়েছি যদিও এরপরে আবার যেতে হচ্ছে।
কেজ্জার

1

আমি রুবির কাছে নতুন, তবে আমি মনে করি (আশা?) এটি দেখার সহজ উপায় ...

প্রতীক কোনও পরিবর্তনশীল বা ধ্রুবক নয়। এটি কোনও মানের জন্য দাঁড়ায় না বা নির্দেশ করে না। একটি প্রতীক একটি মান।

এটি কেবলমাত্র অবজেক্টের ওভারহেড ছাড়াই একটি স্ট্রিং। পাঠ্য এবং শুধুমাত্র পাঠ্য।

তাই এটা:

"hellobuddy"

এই হিসাবে একই:

:hellobuddy

আপনি না করতে পারেন, উদাহরণস্বরূপ: Hellobuddy.upcase। এটি স্ট্রিংয়ের মান এবং কেবলমাত্র স্ট্রিংয়ের মান।

তেমনি, এটি:

greeting =>"hellobuddy"

এই হিসাবে একই:

greeting => :hellobuddy

কিন্তু, আবার স্ট্রিং অবজেক্ট ওভারহেড ছাড়াই।


-1

এর চারপাশে আপনার মাথা গুটিয়ে ফেলার একটি সহজ উপায় হ'ল ভাবনা, "আমি যদি কোনও চিহ্নের চেয়ে স্ট্রিংটি ব্যবহার করতাম তবে কী হবে?

patient1 = { "ruby" => "red" }
patient2 = { "ruby" => "programming" }

এটা মোটেই বিভ্রান্তিকর নয়, তাই না? আপনি একটি হ্যাশের চাবি হিসাবে "রুবি" ব্যবহার করছেন ।

"ruby"একটি স্ট্রিং আক্ষরিক, যাতে মান হয়। মেমরি ঠিকানা, বা পয়েন্টার আপনার কাছে উপলভ্য নয়। যতবার আপনি প্রার্থনা করবেন "ruby", আপনি এটির একটি নতুন উদাহরণ তৈরি করছেন, অর্থাত্, একই মান সহ একটি নতুন মেমরি সেল তৈরি করা হবে -"ruby"

হ্যাশ তারপর যায় "আমার কী মান কি? ওহ এটা "ruby"। তারপর যে মান মানচিত্র" লাল "বা" প্রোগ্রামিং "। অন্য কথায়, :rubyকরতে ডি-রেফারেন্স না "red"বা "programming"। হ্যাশ মানচিত্র :ruby থেকে "red"বা"programming"

আমরা যদি চিহ্ন ব্যবহার করি তবে তার সাথে তুলনা করুন

patient1 = { :ruby => "red" }
patient2 = { :ruby => "programming" }

এর মান :rubyহয় "ruby", কার্যকরীভাবে।

কেন? কারণ প্রতীকগুলি মূলত স্ট্রিং ধ্রুবক । ধ্রুবকগুলির একাধিক উদাহরণ নেই। এটি একই মেমরি ঠিকানা। এবং একটি মেমরি ঠিকানার একটি নির্দিষ্ট মান থাকে, যা একবার বিবেচিত হয়। প্রতীকগুলির জন্য, পয়েন্টারের নাম প্রতীক, এবং অবচিত মানটি একটি স্ট্রিং, যা প্রতীক নামের সাথে মেলে, এক্ষেত্রে "ruby",।

যখন কোনও হ্যাশ থাকে, আপনি প্রতীক, পয়েন্টারটি ব্যবহার করেন না, তবে মানযুক্ত মান। আপনি ব্যবহার করছেন না :ruby, কিন্তু "ruby"। হ্যাশটির পরে কীটির সন্ধান করা হবে "ruby", মানটি হয় "red"বা"programming" , আপনি কিভাবে হ্যাশ সংজ্ঞায়িত উপর নির্ভর করে।

দৃষ্টান্তের শিফট এবং টেক-হোম কনসেপ্টটি হ'ল যে হ্যাশের একটি কী দেওয়া একটি প্রতীকটির মান হ্যাশ দ্বারা ম্যাপ করা মান থেকে সম্পূর্ণ পৃথক ধারণা।


4
এই ব্যাখ্যাটিতে ত্রুটি বা ত্রুটি কী, ডাউনভোটার্স? শেখার জন্য কৌতূহলী
আহ্নবিজক্যাড

কেবল কারণ একটি উপমা কারও কারও কাছে বিরক্তিকর হতে পারে, এর অর্থ এটি ত্রুটিযুক্ত নয়।
আহ্নবিজক্যাড

4
অগত্যা আমি কোনও ত্রুটি দেখতে পাচ্ছি না, তবে আপনি এই উত্তরে যা বলার চেষ্টা করছেন তা পিন করা অত্যন্ত কঠিন।
বিপরীত ইঞ্জিনিয়ার্ড

এক্স ব্যাখ্যার প্রসঙ্গ / সত্তার উপর ভিত্তি করে এক্স ইন্টারটিটেড এবং ধারণাটি ভিন্নভাবে তৈরি করা হয়। বেশ সহজ.
আহ্নবিজক্যাড

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