التساوي (Equality) في لغة Kotlin
تحتوي لغة Kotlin على نوعين من التساوي:
- التساوي البنيويّ (structural equality): يكون التحقُّق فيه عبر الدالة
equals()
. - التساوي المرجعيّ (referential equality): وهو التحقُّق من الإشارة إلى نفس الكائن (object).
التساوي البنيويّ (Structural Equality)
يعتمد التساوي البنيويّ على المعامل ==
ونفيه =!
، إذ يُترجَم التعبير a == b
إلى الصيغة:
a?.equals(b) ?: (b === null)
فإن لم يحتوِ المتغيِّر a
على القيمة الفارغة null
فستُستدعَى الدالةequals(Any?)
، أما إن كانت قيمته null
فيجري التحقُّق من أنّ b
مساوٍ -مرجعيًّا- للقيمة null
.
ولا حاجة للمقارنة الصريحة الصارمة (explicit) مع القيمة null
في الشيفرة لأنّ التعبير a == null
سيُترجَم تلقائيًا إلى الصيغة a === null
.
تساوي أعداد الفاصلة العائمة
تخضع عملية المقارنة للمعايير القياسيّة IEEE 754 للعمليات الحسابيّة على أعداد الفاصلة العائمة إن كان المعاملان (operands) على طرفيّ المساواة مُعرَّفان ستاتيكيًّا من النوع Float
أو Double
(سواءً أكانت القيمة null
أم لا).
ويُستخدَم التساوي البنيويّ (structural equality) في الحالات الأخرى، والذي لا يوافق المعايير القياسيّة فلذلك تكون القيمة NaN
مساويةً لنفسها وتختلف القيمتان 0.0-
و 0.0
عن بعضهما.
راجع مقارنة أعداد الفاصلة العائمة.
التساوي المرجعيّ (Referential Equality)
يعتمد على المعامل ===
ونفيه ==!
حيث ستنتُج القيمة true
عن الشرط a === b
فقط وفقط إذا كان كلا المتغيِّرين a
و b
يشيران لنفس الكائن (object)، أمّا عندما تكون القيم مُمثَّلةً بأنواعٍ أساسيّةٍ (primitive types) أثناء التنفيذ (مثل النوع Int
) فيكون المعامل ===
حينئذٍ مكافئًا للمعامل ==
.