স্কালায় ==এবং এর .equals()মধ্যে পার্থক্য কী এবং কখন ব্যবহার করতে হবে?
বাস্তবায়ন কি জাভার মতো?
সম্পাদনা: সম্পর্কিত প্রশ্ন নির্দিষ্ট ক্ষেত্রে সম্পর্কে আলোচনা করে AnyVal। আরও সাধারণ ক্ষেত্রে হয় Any।
স্কালায় ==এবং এর .equals()মধ্যে পার্থক্য কী এবং কখন ব্যবহার করতে হবে?
বাস্তবায়ন কি জাভার মতো?
সম্পাদনা: সম্পর্কিত প্রশ্ন নির্দিষ্ট ক্ষেত্রে সম্পর্কে আলোচনা করে AnyVal। আরও সাধারণ ক্ষেত্রে হয় Any।
উত্তর:
আপনি সাধারণত ==এটি ব্যবহার করেন , এটি রুট করে equals, এটির সাথে এটি nullসঠিকভাবে আচরণ করে । রেফারেন্স সমতা (খুব কম ব্যবহৃত হয়) হয় eq।
3 == BigInt(3)এবং BigInt(3) == 3সত্য। তবে, 3.equals(BigInt(3))মিথ্যা, যদিও BigInt(3).equals(3)সত্য। অতএব, ব্যবহার পছন্দ করুন ==। equals()স্কালায় ব্যবহার করা এড়িয়ে চলুন । আমি মনে করি ==নিখুঁত রূপান্তরটি ভালভাবে equals()করে তবে তা হয় না।
new java.lang.Integer(1) == new java.lang.Double(1.0)হলেও সত্য কেন new java.lang.Integer(1) equals new java.lang.Double(1.0)?
equalsপ্রতিটি উদাহরণের সামগ্রীর তুলনা করার জন্য ওভাররাইড পদ্ধতি। এটি equalsজাভাতে ব্যবহৃত একই পদ্ধতি==চিন্তা না করে তুলনা করতে অপারেটরটি ব্যবহার করুনnulleqউভয় যুক্তি ঠিক একই রেফারেন্স কিনা তা পরীক্ষা করতে পদ্ধতি ব্যবহার করুন । এটি কীভাবে কাজ করে তা বুঝতে না পারলে ব্যবহার না করার প্রস্তাব দেওয়া হয়েছে এবং equalsপরিবর্তে আপনার যা প্রয়োজন তার জন্য প্রায়শই কাজ করবে। এবং এটি কেবল AnyRefযুক্তি দিয়েই নয় এটি ব্যবহার করার বিষয়টি নিশ্চিত করুনAnyদ্রষ্টব্য: equalsজাভা হিসাবে, যেমন আপনি যুক্তি স্যুইচ করেন তবে একই ফলাফলটি ফিরে না আসতে পারে যেমন বিপরীতটি 1.equals(BigInt(1))ফিরে আসবে falseসেখানে ফিরে আসবে true। এটি প্রতিটি প্রয়োগের জন্য শুধুমাত্র নির্দিষ্ট ধরণের পরীক্ষা করে থাকে। আদিম সংখ্যাগুলি দ্বিতীয় আর্গুমেন্ট Numberবা BigIntপ্রকারের নয় তবে কেবল অন্যান্য আদিম ধরণের কিনা তা পরীক্ষা করে দেখতে পারে না
AnyRef.equals(Any)পদ্ধতি উপশ্রেণী দ্বারা অধিলিখিত অন্যতম। জাভা স্পেসিফিকেশন থেকে একটি পদ্ধতি যা স্কালায়ও এসেছে। যদি একটি আনবক্সেড উদাহরণ ব্যবহার করা হয়, এটি কল করতে এটি বাক্সযুক্ত হয় (যদিও স্কালায় লুকানো রয়েছে; int-> এর সাথে জাভাতে আরও স্পষ্ট Integer)। ডিফল্ট বাস্তবায়ন কেবলমাত্র রেফারেন্সের সাথে তুলনা করে (জাভা হিসাবে)
Any.==(Any)পদ্ধতি দুটি বস্তুর তুলনা এবং (যেন দুই স্থানেই সঙ্গে একটি স্ট্যাটিক পদ্ধতি কলিং) হয় যুক্তি নাল হতে পারবেন। এটি যদি উভয়ই হয় তার সাথে তুলনা করে null, তবে এটি equals(Any)পদ্ধতিটিকে বক্সযুক্ত ইভেন্টে কল করে ।
AnyRef.eq(AnyRef)পদ্ধতি তুলনা শুধুমাত্র রেফারেন্স হলো, যেখানে উদাহরণস্বরূপ মেমরি অবস্থিত। এই পদ্ধতির জন্য কোনও অন্তর্নিহিত বক্সিং নেই।
1 equals 2falseএটি পুনঃনির্দেশ হিসাবে যেমন ফিরে আসবেInteger.equals(...)1 == 2falseএটি পুনঃনির্দেশ হিসাবে যেমন ফিরে আসবেInteger.equals(...)1 eq 2 সংকলন করবে না, কারণ এটির জন্য উভয় যুক্তিই টাইপ হওয়া দরকার AnyRefnew ArrayList() equals new ArrayList()ফিরে আসবে true, যেমন এটি সামগ্রীটি পরীক্ষা করেnew ArrayList() == new ArrayList()trueএটি পুনঃনির্দেশ হিসাবে যেমন ফিরে আসবেequals(...)new ArrayList() eq new ArrayList()falseউভয় যুক্তি ভিন্ন উদাহরণ হিসাবে ফিরে আসবেfoo equals fooফিরে আসবে true, যদি না fooহয় null, তবে একটি নিক্ষেপ করবেNullPointerExceptionfoo == fooফিরে আসবে true, এমনকি যদি fooহয়nullfoo eq footrueউভয় যুক্তি একই রেফারেন্সের সাথে লিঙ্ক থাকায়, ফিরে আসবেতার মাঝে একটা মজার পার্থক্য নেই ==এবং equalsজন্য Floatএবং Doubleপ্রকারসমূহ: তারা চিকিত্সা NaNভিন্নভাবে:
scala> Double.NaN == Double.NaN
res3: Boolean = false
scala> Double.NaN equals Double.NaN
res4: Boolean = true
সম্পাদনা: হিসাবে একটি মন্তব্যে উল্লেখ করা হয় - "এই জাভা ঘটে" - ঠিক কি উপর নির্ভর করে এই হল:
public static void main(final String... args) {
final double unboxedNaN = Double.NaN;
final Double boxedNaN = Double.valueOf(Double.NaN);
System.out.println(unboxedNaN == unboxedNaN);
System.out.println(boxedNaN == boxedNaN);
System.out.println(boxedNaN.equals(boxedNaN));
}
এটি মুদ্রণ করবে
false
true
true
সুতরাং, সমতার জন্য তুলনা করার সময় unboxedNanফলন falseহ'ল কারণ এটিই আইইইই ভাসমান পয়েন্ট সংখ্যাগুলি এটি সংজ্ঞায়িত করে এবং প্রতিটি প্রোগ্রামিং ভাষায় এটি হওয়া উচিত (যদিও এটি কোনওভাবে পরিচয়ের ধারণার সাথে মেসেজ করে)।
বাক্সযুক্ত এনএএন ==জাভা ব্যবহার করে তুলনা করার জন্য সত্য ফল দেয় কারণ আমরা বস্তুর রেফারেন্সগুলির তুলনা করছি।
equalsমামলার আমার কাছে কোনও ব্যাখ্যা নেই , আইএমএইচও এটির ==আনবক্সড ডাবল মানগুলির মতোই আচরণ করা উচিত , তবে তা হয় না।
স্ক্যালায় অনুবাদিত বিষয়টি কিছুটা জটিল কারণ স্কালার আদিম এবং বস্তুর প্রকারগুলিকে একীভূত করা হয়েছে Anyএবং আদিম ডাবল এবং প্রয়োজনীয় বাক্সযুক্ত ডাবলে অনুবাদ করা হয়েছে। সুতরাং স্কেলটি ==স্পষ্টতই আদিম NaNমানের তুলনা equalsকরতে শুরু করে তবে বাক্সযুক্ত ডাবল মানগুলিতে সংজ্ঞায়িত একটি ব্যবহার করে (অনেকগুলি রূপান্তর রূপান্তর যাদু চলছে এবং সেখানে দ্বিগুণ হয়ে স্ট্যাম্প থাকে RichDouble)।
আপনার যদি সত্যই কিছু খুঁজে পাওয়া দরকার তবে এটি NaNব্যবহার করতে পারেন isNaN: