স্কালায় == এবং .equals এর মধ্যে পার্থক্য কী?


144

স্কালায় ==এবং এর .equals()মধ্যে পার্থক্য কী এবং কখন ব্যবহার করতে হবে?

বাস্তবায়ন কি জাভার মতো?

সম্পাদনা: সম্পর্কিত প্রশ্ন নির্দিষ্ট ক্ষেত্রে সম্পর্কে আলোচনা করে AnyVal। আরও সাধারণ ক্ষেত্রে হয় Any



@ আমার মনে হয়েছে যে অন্য প্রশ্ন জিজ্ঞাসার তারিখ বিবেচনা করে সদৃশ হিসাবে চিহ্নিত করা উচিত। এছাড়াও, আমি মনে করি দুটি প্রশ্নই আলাদা।
Jus12

উত্তর:


201

আপনি সাধারণত ==এটি ব্যবহার করেন , এটি রুট করে equals, এটির সাথে এটি nullসঠিকভাবে আচরণ করে । রেফারেন্স সমতা (খুব কম ব্যবহৃত হয়) হয় eq


12
জাভা লাইব্রেরি ব্যবহার করার সময় কি এটি প্রয়োগ হয়?
Jus12

20
এটা করে. উদাহরণস্বরূপ নতুন java.util.ArrayList [Int] () == নতুন java.util.ArrayList [Int] (), যেমন অ্যারেলিস্টের সমান বিষয়বস্তু সমতা।
দিদিয়ার ডুপন্ট

5
ইন্ট এবং লং এবং == বনাম .equals () এর চারপাশে কিছু অদ্ভুত আচরণ রয়েছে। ইন্ট এবং লং হিসাবে একই সংখ্যার জন্য == সত্য তবে সমান হিসাবে মিথ্যা। সুতরাং == সর্বদা সমান পথে যাত্রা করে না।
হ্যারল্ড এল

24
আরও মজার বিষয়, উভয় 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)?
ইস্টসুন

33

==একটি চূড়ান্ত পদ্ধতি এবং কল .equals, যা চূড়ান্ত নয়।

এটি জাভা থেকে একেবারে আলাদা, যেখানে ==কোনও পদ্ধতির পরিবর্তে অপারেটর এবং অবজেক্টের জন্য রেফারেন্স সমতার তুলনায় কঠোরভাবে তুলনা করেন।


29

টি এল; ডিআর

  • equalsপ্রতিটি উদাহরণের সামগ্রীর তুলনা করার জন্য ওভাররাইড পদ্ধতি। এটি equalsজাভাতে ব্যবহৃত একই পদ্ধতি
  • উল্লেখগুলি নিয়ে ==চিন্তা না করে তুলনা করতে অপারেটরটি ব্যবহার করুনnull
  • eqউভয় যুক্তি ঠিক একই রেফারেন্স কিনা তা পরীক্ষা করতে পদ্ধতি ব্যবহার করুন । এটি কীভাবে কাজ করে তা বুঝতে না পারলে ব্যবহার না করার প্রস্তাব দেওয়া হয়েছে এবং 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 সংকলন করবে না, কারণ এটির জন্য উভয় যুক্তিই টাইপ হওয়া দরকার AnyRef
  • new ArrayList() equals new ArrayList()ফিরে আসবে true, যেমন এটি সামগ্রীটি পরীক্ষা করে
  • new ArrayList() == new ArrayList()trueএটি পুনঃনির্দেশ হিসাবে যেমন ফিরে আসবেequals(...)
  • new ArrayList() eq new ArrayList()falseউভয় যুক্তি ভিন্ন উদাহরণ হিসাবে ফিরে আসবে
  • foo equals fooফিরে আসবে true, যদি না fooহয় null, তবে একটি নিক্ষেপ করবেNullPointerException
  • foo == fooফিরে আসবে true, এমনকি যদি fooহয়null
  • foo eq footrueউভয় যুক্তি একই রেফারেন্সের সাথে লিঙ্ক থাকায়, ফিরে আসবে

6

তার মাঝে একটা মজার পার্থক্য নেই ==এবং 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:


এবং এটি জাভাতেও ঘটে!
ইভান সাতরিয়া

4

স্কালায় == প্রথমে নাল মানগুলি পরীক্ষা করুন এবং তারপরে প্রথম বস্তুতে সমান পদ্ধতির কল করুন

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