سكالا مباراة التحلل على أقحم المشغل
-
06-07-2019 - |
سؤال
أنا أحاول أن أفهم تنفيذ List
s في سكالا.ولا سيما أنا أحاول أن أستوعب كيف يمكنك كتابة مباراة التعبير باستخدام أقحم المشغل ، على سبيل المثال:
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)
انظر أيضا سكالا حالة الطبقات الأسئلة