Desen uygun girdi alır ve bir unapply
fonksiyonu ile parçalanır. Yani sizin durumunuzda, unapply(4)
, toplamı 4 olan iki sayıyı döndürmek zorunda kalacaktı. Ancak, 4'e kadar çok sayıda çift var, bu yüzden işlev ne yapacağını bilemez. 2
nasılsa unapply
işlevine erişilebilir olması için
İhtiyacın olduğunu.
case class Sum(addto: Int) {
def unapply(i: Int) = Some(i - addto)
}
val Sum2 = Sum(2)
val Sum2(x) = 5 // x = 3
(Kompaktlık için val Sum(2)(y) = 5
gibi bir şey yapabilmek için iyi olurdu, ama Scala parametreli presi izin vermez; here bkz.)
:
2
saklayan özel bir durum sınıf bunun için çalışacak
[DÜZENLEME: Bu biraz saçma, ama aslında çok aşağıdakileri yapabilirsiniz:
val `2 +` = Sum(2)
val `2 +`(y) = 5 // y = 3
]
DÜZENLEME: head::tail
'un çalışmasının sebebi, kafanın bir listenin kuyruğundan ayrılmasının bir yolunun olması. Eğer bir numara kırmak nasıl istediğini önceden belirlenmiş bir fikir olsaydı +
kullanabilirsiniz: yaklaşık ::
+
karşı doğal özel bir şey yok
.
object + {
def unapply(i: Int) = Some(i-i/2, i/2)
}
ve gibi kullanın::
scala> val a + b = 4
a: Int = 2
b: Int = 2
scala> val c + d = 5
c: Int = 3
d: Int = 2
EDIT: Örneğin, eğer o zaman böyle bir şey yapabileceğini, "ikiye bölünmüş" demek +
istedi Nihayet, this zaman açıklar desen eşleştirme, A op B
, sözdizimi güzel görünmesini sağlayan op(A,B)
ile aynı anlama gelir. case head :: tail
ile Eşleşen
Neden y-2'yi kullanmıyorsunuz (ne zaman y = 4)? –
Bu daha çok bir meraktır, bu yüzden özel bir örneğim yok, ama bunun daha karmaşık sınıflar için güzel olduğunu hayal ettim. – Dylan