Scala neden hem unapply
hem de unapplySeq
kullanıyor? İkisi arasındaki fark nedir? Ne zaman diğerini tercih etmeliyim?Unapply ve unapplySeq arasındaki fark nedir?
33
A
cevap
26
:
object M {
def apply(a: A*): M = ......... // makes a M from an As.
def unapplySeq(m: M): Option[Seq[A]] = ... // retrieve the As from the M
}
val m = M(a1, a2, a3)
m match { case M(a1, a2, a3) => ... }
m match { case M(a, as @ _*) => ... }
İkinci durumda, tekrarlanan parametrelerin Seq
ve A*
ve _*
arasındaki benzerlik gibi ele alındığını unutmayın.
Doğal olarak çeşitli tek değerler içeren bir şeyi yapılandırmak isterseniz, unapply
'u kullanın. Seq
içeren bir öğeyi yapılandırmak isterseniz, unapplySeq
'u kullanın.
18
Sabit ve değişken değişkenlik. Pattern Matching in Scala (pdf), aynalama örnekleri ile iyi açıklar. Ayrıca this answer'da da yansıtma örnekleri var.
Kısaca: Yani
object Sorted {
def unapply(xs: Seq[Int]) =
if (xs == xs.sortWith(_ < _)) Some(xs) else None
}
object SortedSeq {
def unapplySeq(xs: Seq[Int]) =
if (xs == xs.sortWith(_ < _)) Some(xs) else None
}
scala> List(1,2,3,4) match { case Sorted(xs) => xs }
res0: Seq[Int] = List(1, 2, 3, 4)
scala> List(1,2,3,4) match { case SortedSeq(a, b, c, d) => List(a, b, c, d) }
res1: List[Int] = List(1, 2, 3, 4)
scala> List(1) match { case SortedSeq(a) => a }
res2: Int = 1
, aşağıdaki örnekte sergilenmektedir düşünüyorsunuz? Tekrarlanan parametreler için
object S {
def apply(a: A):S = ... // makes a S from an A
def unapply(s: S): Option[A] = ... // retrieve the A from the S
}
val s = S(a)
s match { case S(a) => a }
, apply
yapılar ve unapplySeq
de-yapıları: Düzenli parametreleri apply
yapılar ve unapply
de-yapılar için
: biraz detaya gidiyor ve basitleştirilmesi olmadan
scala> List(1) match { case List(x) => x }
res3: Int = 1
İlgili konular
- 1. scala play json Hayır unapply veya unapplySeq işlevi bulundu
- 2. Python'da {} ve [] arasındaki fark nedir?
- 3. UNIX'teki $ @ ve $ * arasındaki fark nedir?
- 4. $ arasındaki fark nedir? ve PowerShell
- 5. Fark() arasındaki fark nedir mustache.js
- 6. arasındaki fark nedir?
- 7. Java arasındaki fark nedir
- 8. arasındaki fark nedir?
- 9. arasındaki fark nedir?
- 10. app.doScript ve $ .evalFile arasındaki fark nedir?
- 11. gVim ve gVim arasındaki fark nedir?
- 12. isAlpha ve isLetter arasındaki fark nedir?
- 13. Control.Enter ve Control.GotFocus olayları arasındaki fark nedir?
- 14. .got ve .got.plt bölümü arasındaki fark nedir?
- 15. AutomationProperties.AutomationID ve AutomationProperties.Name arasındaki fark nedir?
- 16. Android'de getDir ve getFilesDir arasındaki fark nedir?
- 17. R içinde `=` ve `<-` arasındaki fark nedir?
- 18. uint ve System.UInt32 arasındaki fark nedir?
- 19. PropertyChangeListener ve VetoableChangeListener arasındaki fark nedir?
- 20. XSS'de IDREF ve IDREFS arasındaki fark nedir?
- 21. Cacerts ve keystore arasındaki fark nedir?
- 22. GPLv2 ve GPLv3 arasındaki fark nedir?
- 23. VarIsEmpty ve VarIsEmptyParam işlevleri arasındaki fark nedir
- 24. ActiveSupport'ta mattr_accessor ve cattr_accessor arasındaki fark nedir?
- 25. Hashtable ve Dictionary arasındaki fark nedir?
- 26. RoutedCommand ve RoutedUICommand arasındaki fark nedir?
- 27. MySQL'deki boolean ve bool arasındaki fark nedir?
- 28. Task.Factory.FromAsync ve BeginX/EndX arasındaki fark nedir?
- 29. WideChar ve AnsiChar arasındaki fark nedir?
- 30. PHP'de 'stripcslashes' ve 'stripslashes' arasındaki fark nedir?
Ah teşekkürler! Bu mantıklı. Bir Haskell perspektifinden geldiğimde, “a (b, c)” yi “a :: b :: c :: Nil” ile eşleşerek eşleştirmeyi düşünüyorum, fakat Scala bunu yapmaz; bunun yerine, 'List' unapplySeq' yöntemini kullanır. –
Bu yanıtta atıfta bulunulan kağıt şu adreste bulunabilir: http://www.michaelrueegg.name/static/papers/PatternMatchingInScala.pdf –
@dan Scala, Listede bir unapply yöntemiyle beklediğiniz gibi eşleşebilir: : tamamlayıcı nesne. Beklendiği gibi bu unapply sadece Listeyi (veya daha çok: :) baş ve kuyruğa yıkıyor. Not Bu, herhangi bir Seq için değil, yalnızca Listeler için çalışır. –