আমি যখন বলি { :bla => 1, :bloop => 2 }
, ঠিক কী করে :
? আমি এটি কোথাও পড়েছিলাম এটি স্ট্রিংয়ের সাথে কীভাবে সমান, তবে কোনওভাবে একটি চিহ্ন।
আমি ধারণাটি সম্পর্কে স্পষ্ট নয়, কেউ কি আমাকে আলোকিত করতে পারে?
আমি যখন বলি { :bla => 1, :bloop => 2 }
, ঠিক কী করে :
? আমি এটি কোথাও পড়েছিলাম এটি স্ট্রিংয়ের সাথে কীভাবে সমান, তবে কোনওভাবে একটি চিহ্ন।
আমি ধারণাটি সম্পর্কে স্পষ্ট নয়, কেউ কি আমাকে আলোকিত করতে পারে?
উত্তর:
:foo
"ফু" নামের একটি প্রতীক। প্রতীকগুলির স্বতন্ত্র বৈশিষ্ট্য রয়েছে যে একই নামের দুটি চিহ্ন প্রতীক অভিন্ন হবে:
"foo".equal? "foo" # false
:foo.equal? :foo # true
এটি দুটি চিহ্নের তুলনা সত্যিই দ্রুত করে তোলে (যেহেতু কেবলমাত্র একটি পয়েন্টার তুলনা জড়িত, আপনার মতো স্ট্রিংয়ের মতো সমস্ত চরিত্রের তুলনা করার বিপরীতে), পাশাপাশি আপনার কাছে একই চিহ্নের জিলিয়ন কপি থাকবে না।
এছাড়াও, স্ট্রিংগুলির বিপরীতে, চিহ্নগুলি অপরিবর্তনীয়।
"foo".equal? "foo"
মিথ্যা কেন ? খ) আপনি যে কোনও জায়গায় কোনও প্রতীক উল্লেখ করতে পারেন, প্রয়োজনীয়ত এগুলিকে বৈশ্বিক ভেরিয়েবলের মতো করে তুলতে পারেন?
equal?
রুবি পরিচয় তুলনা করে। প্রতিটি স্ট্রিং আক্ষরিক, যেমন "foo"
একটি নতুন স্ট্রিং উদাহরণ তৈরি করে। এটি সেভাবে কাজ করে কারণ রুবির স্ট্রিংগুলি পরিবর্তনযোগ্য। ২. প্রতীকগুলি বিশ্বব্যাপী, তবে বৈশ্বিক পরিবর্তনশীলগুলির চেয়ে বৈশ্বিক স্থির চেয়ে বেশি, কারণ প্রতীকগুলিতে রাষ্ট্র নেই। সুতরাং চিহ্নগুলি ব্যবহার করা বৈশ্বিক চলকগুলির মতো কোনও অ্যান্টিপ্যাটার্ন নয়।
"foo" == "foo"
# => সত্য
উত্তরে বর্ণিত কিছু বিষয় প্রদর্শন করার জন্য:
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+ গুণ বেশি দ্রুত গতি আসে।
প্রতীকগুলি রুবিতে স্ট্রিং এবং নাম উপস্থাপন করার একটি উপায়।
চিহ্ন এবং স্ট্রিংগুলির মধ্যে প্রধান পার্থক্য হ'ল একই নামের প্রতীকগুলি আরবি করা হয় এবং রুবির সেশনের সময় স্মৃতিতে কেবল একবার উপস্থিত থাকে।
এগুলি কার্যকর যখন আপনি বিভিন্ন জিনিস উপস্থাপন করতে একই শব্দ ব্যবহার করা প্রয়োজন
বিখ্যাত বই অ্যাগিল ওয়েব ডেভেলপমেন্ট উইল রেলস থেকে কিছু উদ্ধৃতি রয়েছে যা প্রতীকটি বুঝতেও সহায়তা করতে পারে :
রেলগুলি জিনিসগুলি সনাক্ত করতে প্রতীক ব্যবহার করে। বিশেষত, পদ্ধতি পরামিতিগুলির নামকরণ এবং হ্যাশগুলিতে জিনিসগুলি অনুসন্ধান করার সময় এটি কী হিসাবে ব্যবহৃত হয়।
redirect_to :action => "edit", :id => params[:id]
আপনি চিহ্নগুলিকে স্ট্রিং লিটারেল হিসাবে ভাবতে পারেন যা জাদুকরভাবে ধ্রুবকগুলিতে তৈরি করা হয়। বিকল্পভাবে, আপনি কোলনটিকে "নামযুক্ত জিনিস" হিসাবে বিবেচনা করতে পারেন, সুতরাং: আইডি "আইডি নামের জিনিস"।
রুবিতে প্রতিটি বস্তুর একটি স্বতন্ত্র অবজেক্ট শনাক্তকারী থাকে, আপনি puts "hello".object_id
যদি নিজের আইআরবিতে লিখেন এবং 2 টি বিভিন্ন সময়ে রিটার্ন হিট করেন তবে আপনি 2 টি পৃথক রিটার্নিং মান পাবেন তবে আপনি যদি :hello.object_id
2 বার লিখেন তবে আপনি কেবল একই মান ফেরতের মান পাবেন। যে পার্থক্য ব্যাখ্যা করা উচিত ছিল।
আপনি যদি ব্যবহার করেন :foo => bar
, foo একটি প্রতীক হবে। প্রতীকগুলির সুবিধা হ'ল এগুলি অনন্য। আপনি যখন হ্যাশের কোনও আইটেমে কল করবেন তখন আপনি তা করেন hash[:foo]
।
চিহ্নগুলির জন্য স্ট্রিংগুলির চেয়ে কম মেমরির প্রয়োজন হয়, যা আপনি যদি আপনার প্রোগ্রামটি আরও দ্রুত তৈরি করতে চান তবে এগুলি তাদের দরকারী করে তোলে।
এই সমস্ত উত্তর একটি অতিরিক্ত 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>
সুতরাং .. পার্ল প্রোগ্রামারদের জন্য .. এটি 'খালি শব্দ'-এর রুবির উত্তর।
আপনি যদি জাভার সাথে পরিচিত হন তবে আপনি সচেতন হতে পারেন যে জাভাতে স্ট্রিংগুলি পরিবর্তনযোগ্য। প্রতীকগুলি রুবিতেও সেই অর্থে একই রকম। এগুলি অপরিবর্তনীয়, অর্থাত্, নির্দিষ্ট চিহ্নের যেকোন সংখ্যক ঘটনা :symbol
কেবলমাত্র একটি একক মেমরি ঠিকানার মানচিত্র তৈরি করবে। এবং, সুতরাং, এটি যেখানেই সম্ভব মেমরির ব্যবহারকে অনুকূল করে তোলে তাই প্রতীকগুলি ব্যবহার করার পরামর্শ দেওয়া হচ্ছে।
NSString
। সেখানে "foo"
সবসময় সমান হবে "foo"
, কারণ অভ্যন্তরীণভাবে স্ট্রিং যে একই শুধু তীক্ষ্ন করছে। যদিও উত্তরটি এখনও বিভ্রান্তিকর হবে।