রুবিতে কোলন অপারেটর কী?


234

আমি যখন বলি { :bla => 1, :bloop => 2 }, ঠিক কী করে :? আমি এটি কোথাও পড়েছিলাম এটি স্ট্রিংয়ের সাথে কীভাবে সমান, তবে কোনওভাবে একটি চিহ্ন।

আমি ধারণাটি সম্পর্কে স্পষ্ট নয়, কেউ কি আমাকে আলোকিত করতে পারে?



7
: এই দিকে তাকিয়ে চেষ্টা প্রতীকসমূহ থেকে Ruby_Newbie গাইড
Hengjie

এই ভিডিওটি আপনাকে প্রতীক সম্পর্কে জেনে রাখা দরকার বলেছে।
টোটেমেডলি

উত্তর:


249

:foo"ফু" নামের একটি প্রতীক। প্রতীকগুলির স্বতন্ত্র বৈশিষ্ট্য রয়েছে যে একই নামের দুটি চিহ্ন প্রতীক অভিন্ন হবে:

"foo".equal? "foo"  # false
:foo.equal? :foo    # true

এটি দুটি চিহ্নের তুলনা সত্যিই দ্রুত করে তোলে (যেহেতু কেবলমাত্র একটি পয়েন্টার তুলনা জড়িত, আপনার মতো স্ট্রিংয়ের মতো সমস্ত চরিত্রের তুলনা করার বিপরীতে), পাশাপাশি আপনার কাছে একই চিহ্নের জিলিয়ন কপি থাকবে না।

এছাড়াও, স্ট্রিংগুলির বিপরীতে, চিহ্নগুলি অপরিবর্তনীয়।


2
শুধু আশ্চর্যই কেন আক্ষরিক স্ট্রিং স্ট্রিং ইন্টার্নিং সমর্থন করে না?
onmyway133

5
@ onmyway133 কারণ রুবির স্ট্রিং পরিবর্তনীয়। ইন্টার্নিং কেবল পরিবর্তনযোগ্য মানগুলিতে প্রযোজ্য।
ক্রিস জেস্টার-ইয়াং

3
ক) "foo".equal? "foo"মিথ্যা কেন ? খ) আপনি যে কোনও জায়গায় কোনও প্রতীক উল্লেখ করতে পারেন, প্রয়োজনীয়ত এগুলিকে বৈশ্বিক ভেরিয়েবলের মতো করে তুলতে পারেন?
আর্ক 676

2
@ আরকি 676 1. equal?রুবি পরিচয় তুলনা করে। প্রতিটি স্ট্রিং আক্ষরিক, যেমন "foo"একটি নতুন স্ট্রিং উদাহরণ তৈরি করে। এটি সেভাবে কাজ করে কারণ রুবির স্ট্রিংগুলি পরিবর্তনযোগ্য। ২. প্রতীকগুলি বিশ্বব্যাপী, তবে বৈশ্বিক পরিবর্তনশীলগুলির চেয়ে বৈশ্বিক স্থির চেয়ে বেশি, কারণ প্রতীকগুলিতে রাষ্ট্র নেই। সুতরাং চিহ্নগুলি ব্যবহার করা বৈশ্বিক চলকগুলির মতো কোনও অ্যান্টিপ্যাটার্ন নয়।
ক্রিস জেস্টার-ইয়ং

2
@ আরক 676 "foo" == "foo"# => সত্য
ফিলিপ বার্টুজি

44

উত্তরে বর্ণিত কিছু বিষয় প্রদর্শন করার জন্য:

require 'benchmark'

n = 1_000_000

print '"foo".equal? "foo" -> ', ("foo".equal? "foo"), "\n"
print '"foo" == "foo"     -> ', ("foo" == "foo"    ), "\n"
print ':foo.equal? :foo   -> ', (:foo.equal? :foo  ), "\n"
print ':foo == :foo       -> ', (:foo == :foo      ), "\n"

Benchmark.bm(10) do |b|
  b.report('string')     { n.times { "foo".equal? "foo" }}
  b.report('str == str') { n.times { "foo" == "foo"     }}
  b.report('symbol')     { n.times { :foo.equal? :foo   }}
  b.report('sym == sym') { n.times { :foo == :foo       }}
end

এটি চালানো ফলাফল:

"foo".equal? "foo" -> false
"foo" == "foo"     -> true
:foo.equal? :foo   -> true
:foo == :foo       -> true

সুতরাং, স্ট্রিংটির সাথে স্ট্রিংটির সাথে তুলনা করা equal?ব্যর্থ হয় কারণ তারা সমান বিষয়বস্তু হলেও, তারা বিভিন্ন বস্তু। ==সামগ্রীর তুলনা করে, এবং চিহ্নগুলির সাথে সমতুল্য চেকগুলি আরও দ্রুত are

                 user     system      total        real
string       0.370000   0.000000   0.370000 (  0.371700)
str == str   0.330000   0.000000   0.330000 (  0.326368)
symbol       0.170000   0.000000   0.170000 (  0.174641)
sym == sym   0.180000   0.000000   0.180000 (  0.179374)

উভয় প্রতীক পরীক্ষা মূলত গতি হিসাবে একই। ১,০০,০০০ পুনরাবৃত্তির পরে কেবল ০.০০৪73৩৩৩ দ্বিতীয় পার্থক্য রয়েছে, তাই আমি বলব যে এটি ব্যবহারের মধ্যে একটি ধোয়া।


অত্যন্ত সহায়ক! আমার সিস্টেমে, স্ট্রিং এবং প্রতীক উভয়ের তুলনার ==চেয়ে দ্রুততর ফলাফল হয়েছে .equal?। প্রতীক তুলনার ফলে স্ট্রিং তুলনার তুলনায় 3+ গুণ বেশি দ্রুত গতি আসে।
মেলভিনকিম

33

প্রতীকগুলি রুবিতে স্ট্রিং এবং নাম উপস্থাপন করার একটি উপায়।

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

এগুলি কার্যকর যখন আপনি বিভিন্ন জিনিস উপস্থাপন করতে একই শব্দ ব্যবহার করা প্রয়োজন


19

বিখ্যাত বই অ্যাগিল ওয়েব ডেভেলপমেন্ট উইল রেলস থেকে কিছু উদ্ধৃতি রয়েছে যা প্রতীকটি বুঝতেও সহায়তা করতে পারে :

রেলগুলি জিনিসগুলি সনাক্ত করতে প্রতীক ব্যবহার করে। বিশেষত, পদ্ধতি পরামিতিগুলির নামকরণ এবং হ্যাশগুলিতে জিনিসগুলি অনুসন্ধান করার সময় এটি কী হিসাবে ব্যবহৃত হয়।

redirect_to :action => "edit", :id => params[:id]

আপনি চিহ্নগুলিকে স্ট্রিং লিটারেল হিসাবে ভাবতে পারেন যা জাদুকরভাবে ধ্রুবকগুলিতে তৈরি করা হয়। বিকল্পভাবে, আপনি কোলনটিকে "নামযুক্ত জিনিস" হিসাবে বিবেচনা করতে পারেন, সুতরাং: আইডি "আইডি নামের জিনিস"।


5

রুবিতে প্রতিটি বস্তুর একটি স্বতন্ত্র অবজেক্ট শনাক্তকারী থাকে, আপনি puts "hello".object_idযদি নিজের আইআরবিতে লিখেন এবং 2 টি বিভিন্ন সময়ে রিটার্ন হিট করেন তবে আপনি 2 টি পৃথক রিটার্নিং মান পাবেন তবে আপনি যদি :hello.object_id2 বার লিখেন তবে আপনি কেবল একই মান ফেরতের মান পাবেন। যে পার্থক্য ব্যাখ্যা করা উচিত ছিল।


মূলত কোলন অপারেটর একটি প্রতীক
সিজার জুনিয়র রদ্রিগেজ

2

আপনি যদি ব্যবহার করেন :foo => bar, foo একটি প্রতীক হবে। প্রতীকগুলির সুবিধা হ'ল এগুলি অনন্য। আপনি যখন হ্যাশের কোনও আইটেমে কল করবেন তখন আপনি তা করেন hash[:foo]

চিহ্নগুলির জন্য স্ট্রিংগুলির চেয়ে কম মেমরির প্রয়োজন হয়, যা আপনি যদি আপনার প্রোগ্রামটি আরও দ্রুত তৈরি করতে চান তবে এগুলি তাদের দরকারী করে তোলে।


0

এটি একটি প্রতীক। মূলত, আপনি বলছেন যে হ্যাশের দুটি উপাদানগুলির কী রয়েছে blaএবং bloopযতটা আপনি স্ট্রিং ব্যবহার করেছেন "bla"এবং "bloop"। তবে তারা স্ট্রিংয়ের চেয়ে কম স্মৃতি গ্রহণ করে এবং টাইপ করা সহজ।


0

এই সমস্ত উত্তর একটি অতিরিক্ত tantalizing বিশদ বাদ দেয় .. যদি আপনি প্রতীকটি স্ট্রাইফাই করেন: foo, আপনি পাবেন .. কি অনুমান .. স্ট্রিং "foo"। অত: পর

irb(main):025:0>
irb(main):026:0> :foo
=> :foo
irb(main):027:0> "#{:foo}"
=> "foo"
irb(main):028:0>
irb(main):029:0> 'foo' <=> :foo
=> nil
irb(main):030:0> 'foo' <=> :foo.to_s
=> 0
irb(main):031:0>

সুতরাং .. পার্ল প্রোগ্রামারদের জন্য .. এটি 'খালি শব্দ'-এর রুবির উত্তর।


-1

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


1
প্রতীকগুলি অপরিবর্তনীয় এই বিষয়টি নিশ্চিত করে যে আপনার অ্যাপ্লিকেশন জুড়ে সেগুলি সর্বদা একই দৃষ্টিকোণ এবং তাই সেগুলি একই বস্তুর গ্যারান্টিযুক্ত। এই রেফারেন্সগুলি দেখুন: ট্রাবলশুটারস / কোডেকর্ন / রবি / সাইম্বলস.ইচটিএম রবার্টসিনস্কি.com/2009/01/11/ … আপনি গুগল করলে আপনি আরও বেশি লোড পাবেন।
ধ্রুব সাগর

আমি জাভা আপনার উপমা সম্পর্কে কথা বলছি। জাভা স্ট্রিংগুলি প্রতীকগুলির সাথে সাদৃশ্য নয়। জাভা স্ট্রিং লিটারেলগুলি কিন্তু সমস্ত স্ট্রিং নয়।
স্মার্টনাট 700 7

সম্ভবত আমার বক্তব্য যথেষ্ট পরিষ্কার ছিল না। তারা একে অপরের সাথে সাদৃশ্যযুক্ত কেবলমাত্র তারা অপরিবর্তনীয় to
ধ্রুব সাগর

@ ধ্রুবসাগর: আপনি যদি সিটি অবজেক্টিভ ব্যবহার করেন তবে সাদৃশ্যটি আরও ভাল NSString। সেখানে "foo"সবসময় সমান হবে "foo", কারণ অভ্যন্তরীণভাবে স্ট্রিং যে একই শুধু তীক্ষ্ন করছে। যদিও উত্তরটি এখনও বিভ্রান্তিকর হবে।
রাফায়েল বুগাজিস্কি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.