الفرق بين المراجعتين لصفحة: «Kotlin/equality»

من موسوعة حسوب
أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE:التساوي (Equality) في لغة Kotlin}}</noinclude> تحتوي لغة Kotlin على نوعين من التساوي: * '''التساوي...'
 
ط تعديل مصطلح متحول
 
(مراجعة متوسطة واحدة بواسطة مستخدم واحد آخر غير معروضة)
سطر 7: سطر 7:
يعتمد التساوي البنيويّ على المعامل <code>==</code> ونفيه <code>=!</code> ، إذ يُترجَم التعبير  <code>a == b</code> إلى الصيغة:<syntaxhighlight lang="kotlin">
يعتمد التساوي البنيويّ على المعامل <code>==</code> ونفيه <code>=!</code> ، إذ يُترجَم التعبير  <code>a == b</code> إلى الصيغة:<syntaxhighlight lang="kotlin">
a?.equals(b) ?: (b === null)
a?.equals(b) ?: (b === null)
</syntaxhighlight>فإن لم يحتوِ المتحوّل <code>a</code> على القيمة الفارغة <code>null</code> ستُستدعَى الدالة<code>equals(Any?)‎</code> ، أما إن كانت قيمته <code>null</code> فيجري التحقُّق من أنّ <code>b</code> مساوٍ -مرجعيًّا- للقيمة <code>null</code>.
</syntaxhighlight>فإن لم يحتوِ المتغيِّر <code>a</code> على القيمة الفارغة <code>null</code> فستُستدعَى الدالة<code>equals(Any?)‎</code> ، أما إن كانت قيمته <code>null</code> فيجري التحقُّق من أنّ <code>b</code> مساوٍ -مرجعيًّا- للقيمة <code>null</code>.


ولا حاجة للمقارنة الصريحة (explicit) مع القيمة <code>null</code> في الشيفرة لأنّ التعبير <code>a == null</code> سيُترجَم تلقائيًا إلى الصيغة <code>a === null</code>.
ولا حاجة للمقارنة الصريحة الصارمة (explicit) مع القيمة <code>null</code> في الشيفرة لأنّ التعبير <code>a == null</code> سيُترجَم تلقائيًا إلى الصيغة <code>a === null</code>.


== تساوي أعداد الفاصلة العائمة ==
== تساوي أعداد الفاصلة العائمة ==
تخضع عملية المقارنة للمعايير القياسيّة IEEE 754 للعمليات الحسابيّة على أعداد الفاصلة العائمة إن كان المتحولان (operands) على طرفيّ المساواة مُعرَّفان ستاتيكيًّا من النوع <code>Float</code> أو <code>Double</code> (سواءً أكانت القيمة <code>null</code> أم لا).
تخضع عملية المقارنة للمعايير القياسيّة IEEE 754 للعمليات الحسابيّة على أعداد الفاصلة العائمة إن كان المعاملان (operands) على طرفيّ المساواة مُعرَّفان ستاتيكيًّا من النوع <code>Float</code> أو <code>Double</code> (سواءً أكانت القيمة <code>null</code> أم لا).


ويُستخدَم التساوي البنيويّ (structural equality) في الحالات الأخرى، والذي لا يوافق المعايير القياسيّة فلذلك تكون القيمة <code>NaN</code> مساويةً لنفسها وتختلف القيمتان <code>0.0-</code> و <code>0.0</code> عن بعضهما.
ويُستخدَم التساوي البنيويّ (structural equality) في الحالات الأخرى، والذي لا يوافق المعايير القياسيّة فلذلك تكون القيمة <code>NaN</code> مساويةً لنفسها وتختلف القيمتان <code>0.0-</code> و <code>0.0</code> عن بعضهما.
سطر 19: سطر 19:


== التساوي المرجعيّ (Referential Equality) ==
== التساوي المرجعيّ (Referential Equality) ==
يعتمد على المعامل <code>===</code> ونفيه <code>==!</code> حيث ستنتُج القيمة <code>true</code> عن الشرط <code>a === b</code>  فقط وفقط إذا كان كلا المتحولين <code>a</code> و <code>b</code> يشيران لنفس الكائن (object)، أمّا عندما تكون القيم مُمثَّلةً بأنواعٍ أساسيّةٍ (primitive types) أثناء التنفيذ (مثل النوع <code>Int</code>) فيكون المعامل <code>===</code> حينئذٍ مكافئًا للمعامل <code>==</code>.
يعتمد على المعامل <code>===</code> ونفيه <code>==!</code> حيث ستنتُج القيمة <code>true</code> عن الشرط <code>a === b</code>  فقط وفقط إذا كان كلا المتغيِّرين <code>a</code> و <code>b</code> يشيران لنفس الكائن (object)، أمّا عندما تكون القيم مُمثَّلةً بأنواعٍ أساسيّةٍ (primitive types) أثناء التنفيذ (مثل النوع <code>Int</code>) فيكون المعامل <code>===</code> حينئذٍ مكافئًا للمعامل <code>==</code>.


== مصادر ==
== مصادر ==

المراجعة الحالية بتاريخ 17:23، 4 يوليو 2018

تحتوي لغة 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) فيكون المعامل === حينئذٍ مكافئًا للمعامل ==.

مصادر