التفكيك
الاستخراج من البيانات
التفكيك درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
ما التفكيك؟
يعني التفكيك (ويُسمى أيضًا التفكيك البنيوي) استخراج أجزاء بنية البيانات مباشرةً داخل نمط.
بدلًا من استدعاء أساليب الوصول، تصف البنية وتسمّي الأجزاء التي تريدها.
تفكيك Tuple
تجمع الـ tuple عدة قيم. ويمكنك فصلها في عملية ربط واحدة بكتابة الأسماء بين قوسين.
object Main {
def main(args: Array[String]): Unit = {
val pair = ("Ada", 1815)
val (name, year) = pair
println(s"$name was born in $year")
}
}Tuples في match
يمكنك تفكيك tuple داخل match، مع تسمية كل مكوّن أو مطابقته.
object Main {
def quadrant(p: (Int, Int)): String = p match {
case (0, 0) => "origin"
case (x, 0) => s"on x-axis at $x"
case (0, y) => s"on y-axis at $y"
case (x, y) => s"point ($x, $y)"
}
def main(args: Array[String]): Unit = {
println(quadrant((0, 0)))
println(quadrant((3, 0)))
println(quadrant((2, 5)))
}
}تفكيك رأس القائمة
يقسم العامل :: (cons) القائمة إلى عنصرها الأول (الرأس) وبقية عناصرها (الذيل).
يطابق النمط head :: tail أي قائمة غير فارغة.
object Main {
def first(xs: List[Int]): String = xs match {
case head :: tail => s"head=$head, rest=$tail"
case Nil => "empty"
}
def main(args: Array[String]): Unit = {
println(first(List(10, 20, 30)))
println(first(Nil))
}
}مطابقة أشكال القوائم الدقيقة
يمكنك مطابقة القوائم ذات الطول المحدد بسرد عناصرها، مثل List(a, b) لقائمة تحتوي عنصرين بالضبط.
object Main {
def shape(xs: List[Int]): String = xs match {
case List() => "none"
case List(a) => s"one: $a"
case List(a, b) => s"two: $a, $b"
case _ => "many"
}
def main(args: Array[String]): Unit = {
println(shape(List()))
println(shape(List(1)))
println(shape(List(1, 2)))
println(shape(List(1, 2, 3)))
}
}الاستدعاء التكراري باستخدام الرأس والذيل
يتيح فصل الرأس عن الذيل إجراء استدعاء تكراري واضح على القائمة.
نجمع هنا عناصر القائمة بإضافة الرأس إلى مجموع الذيل.
object Main {
def sum(xs: List[Int]): Int = xs match {
case Nil => 0
case head :: tail => head + sum(tail)
}
def main(args: Array[String]): Unit = {
println(sum(List(1, 2, 3, 4)))
}
}تفكيك البنى المتداخلة
يمكن تداخل الأنماط؛ إذ يمكنك تفكيك tuple داخل قائمة، أو قائمة داخل tuple، دفعةً واحدة.
object Main {
def main(args: Array[String]): Unit = {
val data = List(("a", 1), ("b", 2))
data match {
case (key, value) :: _ => println(s"first key=$key value=$value")
case Nil => println("empty")
}
}
}تجاهل الأجزاء باستخدام _
استخدم _ للمكوّنات التي لا تهمك. ويساعد ذلك في تركيز الأنماط على البيانات التي تحتاج إليها فعلًا.
object Main {
def main(args: Array[String]): Unit = {
val triple = (1, 2, 3)
val (_, middle, _) = triple
println(s"middle = $middle")
}
}ربط أول عنصرين والاحتفاظ بالباقي
يمكنك تسمية العناصر الأولى والتقاط كل ما يليها باستخدام نمط الذيل.
object Main {
def main(args: Array[String]): Unit = {
val xs = List(1, 2, 3, 4, 5)
xs match {
case a :: b :: rest => println(s"a=$a b=$b rest=$rest")
case _ => println("too short")
}
}
}لماذا نستخدم التفكيك؟
يجعل التفكيك الوصول إلى البيانات:
- تصريحيًا: تصف البنية بدلًا من وصف الخطوات
- آمنًا: يُتحقق من البنية أثناء الاستخراج
- موجزًا: تُربط عدة قيم في نمط واحد
ويصبح أكثر قوةً مع case classes.
تجميع المفاهيم
يفكك هذا المثال قائمةً من tuples ويتصرف وفق بنيتها.
object Main {
def report(scores: List[(String, Int)]): String = scores match {
case Nil => "no scores"
case (name, pts) :: Nil => s"only $name with $pts"
case (name, pts) :: rest => s"top $name=$pts plus ${rest.size} more"
}
def main(args: Array[String]): Unit = {
println(report(Nil))
println(report(List(("Ann", 90))))
println(report(List(("Ann", 90), ("Bo", 80))))
}
}اختبار سريع
اختبر مدى فهمك للتفكيك.
مراجعة
لقد تعلمت تفكيك البيانات في الأنماط:
- تُفكك Tuples باستخدام
(a, b) - تُفكك القوائم باستخدام
head :: tailأو أشكال دقيقة مثلList(a, b) - يطابق
Nilالقائمة الفارغة - استخدم
_لتجاهل الأجزاء، وضمّن الأنماط للبنى العميقة - يتيح فصل الرأس والذيل إجراء استدعاء تكراري واضح
الأسئلة الشائعة
هل درس «التفكيك» مجاني؟
نعم — نص درس «التفكيك» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
ماذا ستتعلم في «التفكيك»؟
الاستخراج من البيانات تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟
لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «التفكيك»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟
نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.