সমতা অপারেটর: == এবং! =
== অপারেটর, যাকে সমতা বা দ্বিগুণ সমান হিসাবেও পরিচিত, যদি উভয় বস্তু সমান এবং মিথ্যা না হয় তবে সত্যটি ফিরে আসবে।
"koan" == "koan" # Output: => true
! = অপারেটর, বৈষম্য হিসাবেও পরিচিত, == এর বিপরীত। উভয় বস্তু সমান এবং মিথ্যা না হলে এটি সত্য হবে।
"koan" != "discursive thought" # Output: => true
নোট করুন যে আলাদা ক্রমে একই উপাদানগুলির সাথে দুটি অ্যারে সমান নয়, একই বর্ণের বড় হাতের এবং ছোট হাতের সংস্করণ সমান নয় এবং এই জাতীয়।
বিভিন্ন ধরণের সংখ্যার তুলনা করার সময় (যেমন, পূর্ণসংখ্যা এবং ভাসমান), যদি তাদের সংখ্যার মান একই হয়, তবে == সত্যই ফিরে আসবে।
2 == 2.0 # Output: => true
সমান?
অপারেটরের বিপরীতে যা উভয় অপারেন্ড সমান হয় কিনা তা পরীক্ষা করে, দুটি অপারেন্ড একই বস্তুকে বোঝায় কিনা সমান পদ্ধতিটি পরীক্ষা করে। এটি রুবির সাম্যের শক্ততম রূপ।
উদাহরণ: a = "জেন" বি = "জেন"
a.object_id # Output: => 20139460
b.object_id # Output :=> 19972120
a.equal? b # Output: => false
উপরের উদাহরণে, আমাদের একই মান সহ দুটি স্ট্রিং রয়েছে। যাইহোক, তারা দুটি স্বতন্ত্র অবজেক্ট, বিভিন্ন বস্তুর আইডি সহ। সুতরাং, সমান? পদ্ধতি মিথ্যা ফিরে আসবে।
আসুন আবার চেষ্টা করুন, খ শুধুমাত্র এই সময় খ একটি রেফারেন্স হবে। লক্ষ্য করুন যে বস্তু আইডি উভয় ভেরিয়েবলের জন্য একই, কারণ তারা একই বস্তুর দিকে নির্দেশ করে।
a = "zen"
b = a
a.object_id # Output: => 18637360
b.object_id # Output: => 18637360
a.equal? b # Output: => true
eql?
হাশ শ্রেণিতে, একল? এটি সমতা জন্য কী পরীক্ষা করতে ব্যবহৃত হয়। এটি ব্যাখ্যা করার জন্য কিছু ব্যাকগ্রাউন্ডের প্রয়োজন। গণনার সাধারণ প্রসঙ্গে, একটি হ্যাশ ফাংশন যে কোনও আকারের একটি স্ট্রিং (বা একটি ফাইল) নেয় এবং হ্যাশকোড নামক একটি নির্দিষ্ট স্ট্রিং বা পূর্ণসংখ্যার উত্পাদন করে, সাধারণত হ্যাশ হিসাবে পরিচিত to কিছু ব্যবহৃত হ্যাশকোড প্রকারগুলি হ'ল MD5, SHA-1 এবং CRC। এগুলি এনক্রিপশন অ্যালগরিদম, ডাটাবেস সূচীকরণ, ফাইল অখণ্ডতা যাচাইকরণ ইত্যাদিতে ব্যবহৃত হয়। কিছু প্রোগ্রামিং ভাষা যেমন রুবি, হ্যাশ টেবিল নামে একটি সংগ্রহের প্রকার সরবরাহ করে। হ্যাশ টেবিলগুলি অভিধানের মতো সংগ্রহ যা জোড়ায় ডেটা সংরক্ষণ করে, অনন্য কী এবং তার সাথে সম্পর্কিত মানগুলি নিয়ে। ফণা অধীনে, এই কীগুলি হ্যাশকোড হিসাবে সংরক্ষণ করা হয়। হ্যাশ টেবিলগুলি সাধারণত হ্যাশ হিসাবে উল্লেখ করা হয়। লক্ষ্য করুন কীভাবে হ্যাশকান শব্দটি হ্যাশকোড বা হ্যাশ টেবিলকে বোঝায়।
রুবি হ্যাশকোড উত্পন্ন করার জন্য হ্যাশ নামে একটি অন্তর্নির্মিত পদ্ধতি সরবরাহ করে। নীচের উদাহরণে এটি একটি স্ট্রিং নেয় এবং একটি হ্যাশকোড দেয়। লক্ষ্য করুন যে একই মান সহ স্ট্রিংগুলিতে কীভাবে সর্বদা একই হ্যাশকোড থাকে, যদিও তারা স্বতন্ত্র বস্তু (ভিন্ন ভিন্ন আইডি সহ)।
"meditation".hash # Output: => 1396080688894079547
"meditation".hash # Output: => 1396080688894079547
"meditation".hash # Output: => 1396080688894079547
হ্যাশ পদ্ধতিটি কার্নেল মডিউলটিতে প্রয়োগ করা হয়, অবজেক্ট শ্রেণিতে অন্তর্ভুক্ত, যা সমস্ত রুবি অবজেক্টের ডিফল্ট মূল। কিছু ক্লাস যেমন সিম্বল এবং ইন্টিজার ডিফল্ট প্রয়োগ ব্যবহার করে, স্ট্রিং এবং হ্যাশের মতো অন্যরা তাদের নিজস্ব বাস্তবায়ন সরবরাহ করে।
Symbol.instance_method(:hash).owner # Output: => Kernel
Integer.instance_method(:hash).owner # Output: => Kernel
String.instance_method(:hash).owner # Output: => String
Hash.instance_method(:hash).owner # Output: => Hash
রুবিতে, যখন আমরা কোনও হ্যাশ (সংগ্রহ) এ কিছু সঞ্চয় করি তখন কী হিসাবে প্রদত্ত বস্তুটি (যেমন স্ট্রিং বা প্রতীক) হ্যাশকোড হিসাবে রূপান্তরিত হয় এবং সংরক্ষণ করা হয়। পরে, হ্যাশ (সংগ্রহ) থেকে কোনও উপাদান পুনরুদ্ধার করার সময়, আমরা কী হিসাবে একটি বস্তু সরবরাহ করি যা হ্যাশকোডে রূপান্তরিত হয় এবং বিদ্যমান কীগুলির সাথে তুলনা করে। যদি কোনও মিল থাকে তবে সংশ্লিষ্ট আইটেমটির মান ফিরে আসবে। একল ব্যবহার করে তুলনা করা হয়? ফণা অধীনে পদ্ধতি।
"zen".eql? "zen" # Output: => true
# is the same as
"zen".hash == "zen".hash # Output: => true
বেশিরভাগ ক্ষেত্রে, একল? পদ্ধতি == পদ্ধতির অনুরূপ আচরণ করে। তবে, কয়েক ব্যতিক্রম আছে। উদাহরণস্বরূপ, একল? কোনও ফ্লোটের সাথে কোনও পূর্ণসংখ্যার তুলনা করার সময় অন্তর্নিহিত ধরণের রূপান্তর সম্পাদন করে না।
2 == 2.0 # Output: => true
2.eql? 2.0 # Output: => false
2.hash == 2.0.hash # Output: => false
কেস সমতা অপারেটর: ===
স্ট্রিং, রেঞ্জ, এবং রেজিএক্সপ্পের মতো রুবির অনেকগুলি অন্তর্নির্মিত শ্রেণিগুলি === অপারেটরের নিজস্ব বাস্তবায়ন সরবরাহ করে, কেস-সাম্যতা, ট্রিপল সমান বা তিনটি কোয়াল হিসাবেও পরিচিত। যেহেতু এটি প্রতিটি শ্রেণিতে আলাদাভাবে প্রয়োগ করা হয়েছে, এটি যে ধরণের অবজেক্টের উপর ডাকা হয়েছিল তার উপর নির্ভর করে এটি আলাদা আচরণ করবে। সাধারণত, ডানদিকে থাকা অবজেক্টটি বাম দিকের অবজেক্টটির "অন্তর্গত" বা "সদস্য" হলে এটি সত্য হয়। উদাহরণস্বরূপ, এটি কোনও বস্তু শ্রেণীর উদাহরণ (বা এর একটি সাবক্লাস) এর পরীক্ষা করে ব্যবহার করা যেতে পারে।
String === "zen" # Output: => true
Range === (1..2) # Output: => true
Array === [1,2,3] # Output: => true
Integer === 2 # Output: => true
একই ফলটি অন্যান্য পদ্ধতির সাথে অর্জন করা যেতে পারে যা সম্ভবত কাজের জন্য সবচেয়ে উপযুক্ত। দক্ষতা এবং সংক্ষিপ্ততা ত্যাগ না করে সাধারণত যথাসম্ভব স্পষ্ট করে কোড পড়া সহজ write
2.is_a? Integer # Output: => true
2.kind_of? Integer # Output: => true
2.instance_of? Integer # Output: => false
শেষ উদাহরণটি মিথ্যা হিসাবে প্রত্যাবর্তিত হয়েছে তা লক্ষ্য করুন কারণ 2 এর মতো পূর্ণসংখ্যাগুলি ফিক্সনাম বর্গের উদাহরণ, যা পূর্ণসংখ্যা শ্রেণীর একটি সাবক্লাস। ===, কি_এ? এবং উদাহরণ_ও? যদি পদটি প্রদত্ত শ্রেণীর বা কোনও উপশ্রেণীর উদাহরণ হয় তবে পদ্ধতিগুলি সত্য হয়। উদাহরণ_পথটি আরও কঠোর এবং কেবলমাত্র সত্যটি প্রত্যাবর্তন করে যদি বস্তুটি একটি সঠিক শ্রেণীর উদাহরণ, সাবক্লাস নয়।
ইস_এ? এবং দয়ালু_? পদ্ধতিগুলি কার্নেল মডিউলটিতে প্রয়োগ করা হয়, যা বস্তু শ্রেণীর দ্বারা মিশ্রিত হয়। উভয়ই একই পদ্ধতির এলিয়াস। আসুন যাচাই করুন:
কার্নেল.ইনস্ট্যান্স_মোথোড (: দয়া করে_আফ?) == কার্নেল.ইনস্ট্যান্স_মোথোড (: এটি_এ?) # আউটপুট: => সত্য
=== এর ব্যাপ্তি বাস্তবায়ন
যখন === অপারেটরকে একটি ব্যাপ্তি অবজেক্টে ডাকা হয়, ডানদিকে মান বামদিকে পরিসরের মধ্যে পড়ে তবে এটি সত্য হয়।
(1..4) === 3 # Output: => true
(1..4) === 2.345 # Output: => true
(1..4) === 6 # Output: => false
("a".."d") === "c" # Output: => true
("a".."d") === "e" # Output: => false
মনে রাখবেন যে === অপারেটর বাম-হাতের অবজেক্টের === পদ্ধতিটি আহ্বান করে। সুতরাং (১.৪.৪) === ((১.৪) এর সমান। === ৩. অন্য কথায়, বাম-হাতের ক্রিয়াকলাপটি নির্ধারণ করবে যে === পদ্ধতির প্রয়োগ কী হবে? বলা হয়, সুতরাং অপারেন্ড অবস্থানগুলি বিনিময়যোগ্য নয়।
=== এর রিজেপক্স বাস্তবায়ন
ডান দিকের স্ট্রিংটি বামে নিয়মিত প্রকাশের সাথে মিলে গেলে সত্যটি প্রত্যাবর্তন করে। / zen / === "আজ জাজেন অনুশীলন করুন" # আউটপুট: => সত্য # "আজ অনুশীলন জাজেন" এর মতো = = ~ / জেন /
ক্ষেত্রে / যখন বিবৃতিগুলিতে === অপারেটরের অন্তর্ভুক্ত ব্যবহার
এই অপারেটরটি কেস / যখন স্টেটমেন্টগুলি হুডের নীচেও ব্যবহৃত হয়। এটি এর সবচেয়ে সাধারণ ব্যবহার।
minutes = 15
case minutes
when 10..20
puts "match"
else
puts "no match"
end
# Output: match
উপরের উদাহরণে, যদি রুবি সুস্পষ্টভাবে ডাবল সমান অপারেটর (==) ব্যবহার করে থাকে তবে 10..20 পরিসীমাটি 15 এর মতো পূর্ণসংখ্যার সমান হিসাবে বিবেচিত হবে না They তারা মিলছে কারণ ট্রিপল সমান অপারেটর (===) হয় স্পষ্টভাবে সমস্ত ক্ষেত্রে / যখন বিবৃতি ব্যবহার করা হয়। উপরের উদাহরণে কোডটি সমান:
if (10..20) === minutes
puts "match"
else
puts "no match"
end
প্যাটার্ন ম্যাচিং অপারেটর: = ~ এবং! ~ ~
রেগেক্স প্যাটার্নগুলির বিপরীতে স্ট্রিং এবং চিহ্নগুলির সাথে ম্যাচ করার জন্য = ~ (সমান তিল্ড) এবং! Opera (ব্যাং-টিলডে) অপারেটরগুলি ব্যবহৃত হয়।
স্ট্রিং এবং সিম্বল ক্লাসে = ~ পদ্ধতির প্রয়োগটি একটি নিয়মিত অভিব্যক্তি (রিজেক্সপ্স শ্রেণীর উদাহরণ) হিসাবে আর্গুমেন্ট হিসাবে প্রত্যাশা করে।
"practice zazen" =~ /zen/ # Output: => 11
"practice zazen" =~ /discursive thought/ # Output: => nil
:zazen =~ /zen/ # Output: => 2
:zazen =~ /discursive thought/ # Output: => nil
Regexp শ্রেণিতে প্রয়োগটি আর্গুমেন্ট হিসাবে একটি স্ট্রিং বা প্রতীক প্রত্যাশা করে।
/zen/ =~ "practice zazen" # Output: => 11
/zen/ =~ "discursive thought" # Output: => nil
সমস্ত বাস্তবায়নে, যখন স্ট্রিং বা প্রতীকটি রেজিপ্লেক্স প্যাটার্নের সাথে মেলে, এটি একটি পূর্ণসংখ্যা দেয় যা ম্যাচের অবস্থান (সূচক)। কোনও মিল না থাকলে এটি শূন্য করে। মনে রাখবেন যে, রুবিতে, কোনও পূর্ণসংখ্যা মান "সত্যবাদী" এবং শূন্যস্থানটি "মিথ্যা" হয়, সুতরাং বিবরণী এবং টের্নারি অপারেটর যদি = ~ অপারেটরটি ব্যবহার করতে পারেন।
puts "yes" if "zazen" =~ /zen/ # Output: => yes
"zazen" =~ /zen/?"yes":"no" # Output: => yes
প্যাটার্ন-ম্যাচিং অপারেটরগুলি বিবৃতি স্বল্প লেখার জন্যও দরকারী। উদাহরণ:
if meditation_type == "zazen" || meditation_type == "shikantaza" || meditation_type == "kinhin"
true
end
Can be rewritten as:
if meditation_type =~ /^(zazen|shikantaza|kinhin)$/
true
end
! ~ অপারেটর = ~ এর বিপরীত, কোনও ম্যাচ না থাকলে এটি সত্য এবং মিথ্যা প্রমাণিত হয়।
আরও তথ্য এই ব্লগ পোস্টে উপলব্ধ ।
"a" == "a"
,"a" === "a"
এবং"a".eql? "a"
। তবে এটি মিথ্যা:"a".equal? "a"
(আমার রুবি 1.9.2-p180)