الحراس والربط
الشروط في المطابقات
الحراس والربط درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
ما الحارس؟
يضيف الحارس شرطًا منطقيًا إلى الحالة باستخدام if. ولا تطابق الحالة إلا عندما يلائم النمط القيمة ويكون الحارس صحيحًا.
تتيح لك الحراس تقسيم نمط واحد إلى حالات أدق استنادًا إلى القيمة.
إضافة حارس if
اكتب الحارس بعد النمط: case n if n > 0 =>. إذا كان الشرط خاطئًا، تستمر المطابقة إلى الحالة التالية.
object Main {
def sign(n: Int): String = n match {
case x if x > 0 => "positive"
case x if x < 0 => "negative"
case _ => "zero"
}
def main(args: Array[String]): Unit = {
println(sign(5))
println(sign(-3))
println(sign(0))
}
}الربط ثم الحراسة
يمكن للحارس الإشارة إلى الاسم الذي ربطته في النمط. وهكذا تختبر خصائص القيمة المطابقة.
object Main {
def fizz(n: Int): String = n match {
case x if x % 15 == 0 => "FizzBuzz"
case x if x % 3 == 0 => "Fizz"
case x if x % 5 == 0 => "Buzz"
case x => x.toString
}
def main(args: Array[String]): Unit = {
println(fizz(15))
println(fizz(9))
println(fizz(7))
}
}الحراس على النطاقات
الحراس مثاليون للنطاقات التي لا تستطيع الأنماط الحرفية التعبير عنها مباشرةً.
object Main {
def band(score: Int): String = score match {
case s if s >= 90 => "A"
case s if s >= 80 => "B"
case s if s >= 70 => "C"
case _ => "F"
}
def main(args: Array[String]): Unit = {
println(band(95))
println(band(83))
println(band(60))
}
}ربط النمط باستخدام @
يربط الرمز @ القيمة المطابقة كاملةً باسم، مع الاستمرار في مطابقة بنيتها.
تعني whole @ pattern: طابق pattern، وسمِّ القيمة المطابقة أيضًا whole.
object Main {
def main(args: Array[String]): Unit = {
val x: Any = 7
val msg = x match {
case n @ (_: Int) => s"int value is $n"
case _ => "other"
}
println(msg)
}
}الربط في المجموعات
يكون الربط باستخدام @ مفيدًا خصوصًا مع الأنماط ذات البنية، مثل التقاط قائمة كاملة مع فحص رأسها في الوقت نفسه.
object Main {
def describe(xs: List[Int]): String = xs match {
case all @ (first :: _) => s"starts with $first, full = $all"
case Nil => "empty"
}
def main(args: Array[String]): Unit = {
println(describe(List(1, 2, 3)))
println(describe(Nil))
}
}دمج نمط النوع والحارس
يمكنك مزج نمط نوع مع حارس. يُفحص النوع أولًا، ثم الشرط المنطقي.
object Main {
def label(x: Any): String = x match {
case s: String if s.length > 3 => "long string"
case s: String => "short string"
case _ => "not a string"
}
def main(args: Array[String]): Unit = {
println(label("hello"))
println(label("hi"))
println(label(42))
}
}شروط متعددة
الحارس مجرد تعبير منطقي، لذا يمكنك دمج الشروط باستخدام && و||.
object Main {
def category(age: Int): String = age match {
case a if a >= 13 && a <= 19 => "teen"
case a if a < 13 => "child"
case _ => "adult"
}
def main(args: Array[String]): Unit = {
println(category(15))
println(category(8))
println(category(40))
}
}لا تنتقل الحراس تلقائيًا
إذا تطابق النمط لكن كان حارسه خاطئًا، تنتقل Scala إلى الحالة التالية، لا إلى الحارس التالي للنمط نفسه.
تأكد من أن حالةً لاحقةً تستطيع التقاط القيم التي تفشل في جميع الحراس.
object Main {
def test(n: Int): String = n match {
case x if x > 100 => "big"
case x => s"not big: $x"
}
def main(args: Array[String]): Unit = {
println(test(200))
println(test(5))
}
}لماذا نستخدم الحراس والربط؟
معًا، تجعل الحراس وروابط @ مطابقة الأنماط غنيةً بالأساليب:
- تضيف الحراس شروطًا مثل النطاقات وقابلية القسمة
- يلتقط
@القيمة كاملةً أثناء تفكيك بنيتها - يحافظان على منطق التفرّع موجزًا وسهل القراءة
تجميع المفاهيم
يربط هذا المثال القيمة، ويفحص حارسًا، ويوفر حالةً احتياطية.
object Main {
def temp(c: Int): String = c match {
case t if t >= 30 => s"hot ($t)"
case t if t >= 15 => s"mild ($t)"
case t => s"cold ($t)"
}
def main(args: Array[String]): Unit = {
println(temp(35))
println(temp(20))
println(temp(5))
}
}اختبار سريع
اختبر مدى فهمك للحراس والربط.
مراجعة
لقد تعلمت تحسين المطابقات:
- الحارس هو شرط
ifيأتي بعد النمط - إذا كان الحارس خاطئًا، تنتقل المطابقة إلى الحالة التالية
- يربط العامل
@القيمة كاملةً أثناء تفكيك بنيتها - يمكن دمج الحراس مع أنماط الأنواع والعوامل المنطقية
الأسئلة الشائعة
هل درس «الحراس والربط» مجاني؟
نعم — نص درس «الحراس والربط» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «الحراس والربط»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟
نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تعبيرات match
- مطابقة الأنواع والقيم
- الحراس والربط
- التفكيك