سؤال

أنا أحاول أن أفهم تنفيذ Lists في سكالا.ولا سيما أنا أحاول أن أستوعب كيف يمكنك كتابة مباراة التعبير باستخدام أقحم المشغل ، على سبيل المثال:

a match {
  case Nil => "An empty list"
  case x :: Nil => "A list without a tail"
  case x :: xs => "A list with a tail"
}

كيف هي مباراة التعبير المسموح x :: xs بدلا من List(x, xs)?

هل كانت مفيدة؟

المحلول

والجواب جاي كونراد هو حق تقريبا. الشيء المهم هو أن <م> مكان هناك كائن اسمه :: التي تطبق طريقة unapply، والعودة نوع Option[(A, List[A])]. هكذا:

object :: {
  def unapply[A](ls: List[A]): Option[(A, A)] = {
    if (ls.empty) None
    else Some((ls.head, ls.tail))
  }
}

// case objects get unapply for free
case object Nil extends List[Nothing]

في حالة :: وList، هذا الكائن يحدث للخروج من حقيقة أن :: هي فئة القضية التي تمتد سمة List. لكن، وكما يوضح المثال أعلاه، فإنه لا <م> هل لديك أن تكون الطبقة القضية على الإطلاق.

نصائح أخرى

:: هو في الواقع فئة (والذي هو فئة فرعية من قائمة )، لذلك قائلا x :: xs ما يعادل معظمها إلى List(x, xs).

ويمكنك القيام بذلك مع فصول القضية الأخرى التي لديها أسماء المشغل. على سبيل المثال:

case class %%%(x: Int, y: Int)

a match {
  case x %%% y => x + y
}

كيف هي مباراة التعبير المسموح x ::xs بدلا من قائمة(x, xs)?

للإجابة على هذا السؤال:

عندما ينظر نمط, أقحم عملية مثل p المرجع س تعادل إلى المرجع(p, q).أي أن أقحم مشغل op يتم التعامل مع منشئ نمط.

(البرمجة في سكالا, 1st ed., p.331)

انظر أيضا سكالا حالة الطبقات الأسئلة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top