Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الأنماط والمطابقة (Patterns & Matching - 3.0)

جزء من قسم البرمجة كائنية التوجه في رحلة Dart على Coddy. الدرس 87 من 110.

قدّمت Dart 3 ميزة مطابقة الأنماط (pattern matching)، وهي طريقة قوية لإجراء destructuring وفحص data في expression واحدة. تتيح لك الأنماط استخراج القيم من الكائنات، والتحقق من بنيتها، وربط المتغيرات — كل ذلك دفعةً واحدة.

لقد رأيتَ بالفعل التفكيك الأساسي باستخدام السجلات. وتوسّع الأنماط ذلك ليشمل العمل مع الكائنات والقوائم والخرائط:

void main() {
  // أنماط القوائم
  var numbers = [1, 2, 3];
  var [a, b, c] = numbers;
  print('$a, $b, $c');  // 1, 2, 3
  
  // أنماط الخرائط
  var user = {'name': 'Alice', 'age': 30};
  var {'name': name, 'age': age} = user;
  print('$name is $age');  // أليس هي 30
}

تصبح الأنماط قوية بشكل خاص في تعبيرات switch. يمكنك المطابقة حسب النوع والقيمة والبنية في الوقت نفسه:

String describe(Object obj) {
  return switch (obj) {
    int n when n < 0 => 'Negative number',
    int n => 'Positive number: $n',
    String s => 'String of length ${s.length}',
    [int first, ...] => 'List starting with $first',
    _ => 'Something else',
  };
}

void main() {
  print(describe(-5));        // عدد سالب
  print(describe(42));        // عدد موجب: 42
  print(describe([1, 2, 3])); // List starting with 1
}

تضيف عبارة when شروطًا إلى الأنماط، وتطابق ... العناصر المتبقية في list. تعمل الشرطة السفلية _ كحرف بدل يطابق أي شيء. وبالاقتران مع الأصناف sealed، تتيح الأنماط معالجة شاملة وآمنة من حيث النوع لهياكل البيانات المعقدة.

challenge icon

التحدي

سهل

لننشئ مصنِّفًا للبيانات يستخدم مطابقة الأنماط لتحليل أنواع مختلفة من input وتصنيفها! ستنشئ نظامًا يمكنه تحديد ووصف هياكل data متنوعة باستخدام ميزات مطابقة الأنماط القوية في Dart 3.

ستنظّم شيفرتك في ملفين:

  • classifier.dart: أنشئ دالة باسم classify تأخذ معاملًا من النوع Object وتُرجع وصفًا من النوع String. استخدم تعبير switch مع مطابقة الأنماط لمعالجة الحالات التالية:
    • يجب أن تُرجع Empty list عند وجود list فارغة []
    • يجب أن تُرجع Single item: [value] عند وجود list تحتوي على integer واحد element بالضبط
    • يجب أن تُرجع Pair: [first] and [second] عند وجود list تحتوي على عنصرين بالضبط
    • يجب أن تُرجع List starting with [first], length: [total length] عند وجود list تبدأ بـ integer متبوعًا بمزيد من elements (استخدم نمط الباقي ...)
    • يجب أن تُرجع [name] is [age] years old عند وجود map يحتوي على المفتاحين 'name' و'age' (استخدم تفكيك نمط map)
    • يجب أن تُرجع Negative: [value] عند وجود integer سالب (استخدم عبارة when)
    • يجب أن تُرجع Zero عند وجود integer يساوي صفرًا
    • يجب أن تُرجع Positive: [value] لأي integer آخر
    • يجب أن تُرجع Unknown type لأي قيمة أخرى
  • main.dart: استورد المصنِّف ووضّح مطابقة الأنماط باستخدام input متنوعة. اطبع نتيجة تصنيف كل قيمة من القيم التالية:
    • list فارغة: []
    • list تحتوي على element واحد: [42]
    • list تحتوي على عنصرين: ['hello', 'world']
    • list أطول: [1, 2, 3, 4, 5]
    • map: {'name': 'Alice', 'age': 25}
    • العدد integer -10
    • العدد integer 0
    • العدد integer 99

يجمع هذا التحدي بين أنماط list وأنماط map وعبارة when للحراس ونمط الباقي (...) - وهي جميع ميزات مطابقة الأنماط الأساسية في الدرس!

الناتج المتوقع:

Empty list
Single item: 42
Pair: hello and world
List starting with 1, length: 5
Alice is 25 years old
Negative: -10
Zero
Positive: 99

جرّب بنفسك

import 'classifier.dart';

void main() {
  // TODO: استخدم الدالة classify لتصنيف كل قيمة
  // واطبع النتائج
  
  // اختبر بقائمة فارغة
  print(classify([]));
  
  // TODO: اختبر بقائمة تحتوي على عنصر واحد: [42]
  
  // TODO: اختبر بقائمة تحتوي على عنصرين: ['hello', 'world']
  
  // TODO: اختبر بقائمة أطول: [1, 2, 3, 4, 5]
  
  // TODO: اختبر بـ map: {'name': 'Alice', 'age': 25}
  
  // TODO: اختبر بالعدد الصحيح -10
  
  // TODO: اختبر بالعدد الصحيح 0
  
  // TODO: اختبر بالعدد الصحيح 99
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Dart عبر الإنترنت