Assignment Operators

في لغة Dart، تُستخدم عوامل التخصيص (Assignment Operators) لتعيين قيم للمتغيرات. إليك شرح مفصل مع أمثلة لكل عامل:

1. العامل الأساسي (=)

يعين قيمة لليمين إلى متغير في اليسار.

مثال:

dart

Copy

int a = 5; // تعيين القيمة 5 للمتغير a
print(a); // الناتج: 5

2. عوامل التخصيص المركبة (Compound Assignment)

تجمع بين عملية حسابية وعملية التعيين في خطوة واحدة.

أ) += (إضافة ثم تعيين)

dart

Copy

a += 3; // تُكافئ: a = a + 3
print(a); // الناتج: 8

ب) -= (طرح ثم تعيين)

dart

Copy

a -= 2; // تُكافئ: a = a - 2
print(a); // الناتج: 6

ج) *= (ضرب ثم تعيين)

dart

Copy

a *= 4; // تُكافئ: a = a * 4
print(a); // الناتج: 24

د) /= (قسمة مع تعيين → الناتج double)

dart

Copy

double b = 24;
b /= 2; // تُكافئ: b = b / 2
print(b); // الناتج: 12.0

هـ) ~/= (قسمة صحيحة ثم تعيين → للمتغيرات من نوع int)

dart

Copy

int c = 5;
c ~/= 2; // تُكافئ: c = c ~/ 2 (القسمة الصحيحة)
print(c); // الناتج: 2

و) %= (الباقي ثم تعيين)

dart

Copy

a %= 5; // تُكافئ: a = a % 5
print(a); // الناتج: 4 (لأن 24 ÷ 5 = 4 والباقي 4)

3. العامل ??= (التعيين إذا كان المتغير فارغًا null)

يعين القيمة فقط إذا كان المتغير يحتوي على null.

مثال:

dart

Copy

int? d; // متغير nullable
d ??= 10; // d كان null، فسيُعيّن 10
print(d); // الناتج: 10

d ??= 20; // d ليس null، فلا يتم التعيين
print(d); // الناتج: 10

4. عوامل التخصيص للعمليات البتية (Bitwise)

تُستخدم مع الأعداد الصحيحة (int).

أ) &= (AND بتّي ثم تعيين)

dart

Copy

int e = 6; // 6 في الثنائي: 110
e &= 3; // 3 في الثنائي: 011 → الناتج: 010 (2)
print(e); // الناتج: 2

ب) |= (OR بتّي ثم تعيين)

dart

Copy

e |= 1; // 2 | 1 = 3 (011)
print(e); // الناتج: 3

ج) ^= (XOR بتّي ثم تعيين)

dart

Copy

e ^= 3; // 3 ^ 3 = 0
print(e); // الناتج: 0

د) <<= (إزاحة لليسار ثم تعيين)

dart

Copy

e = 4; // 100
e <<= 1; // 100 ← إزاحة لليسار ← 1000 (8)
print(e); // الناتج: 8

هـ) >>= (إزاحة لليمين ثم تعيين)

dart

Copy

e >>= 2; // 8 ← إزاحة لليمين ← 10 (2)
print(e); // الناتج: 2

ملاحظات مهمة:

  1. النوع (Type) مهم:
    • عند استخدام /= يجب أن يكون المتغير من نوع double.
    • عند استخدام ~/= يجب أن يكون المتغير من نوع int.
    مثال خاطئ:dartCopyint a = 10; a /= 2; // خطأ! لأن الناتج double ولا يمكن تعيينه لـ int
  2. عامل ??= يتطلب متغيرًا من نوع nullable:dartCopyint? x; // يجب استخدام ? للإعلان عن nullable x ??= 5;

فوائد استخدام عوامل التخصيص:

  • تقليل الأخطاء: تجنب تكرار اسم المتغير (مثل a = a + 3 → a += 3).
  • الكفاءة: كتابة أوضح وأقصر.
  • سهولة الصيانة: تحسين قراءة الكود.