bunu yapmak mümkün istiyorum int için uygulamasını kaldırma ekleyin:Scala -
scala> val Int(i) = "1"
i: Int = 1
Ama Int
bir unapply
yöntemi yoktur.
this answer numaralı belgeyi buldum; bu, varolan bir nesneye dolaylı olarak nasıl bir yöntem ekleyeceğine dair talimatlar veriyor, bu yüzden denedim. Verdikleri çözüm işe yarıyor ama maalesef desen eşleşmesi için değil. İşte ne var:
object UnapplyInt {
val IntRE = """^(\d+)$""".r
def unapply(v: String): Option[Int] = v match {
case IntRE(s) => Some(s.toInt)
case _ => None
}
}
implicit def int2unapplyInt(objA: Int.type) = UnapplyInt
Bu test durumları hepsi gayet:
val UnapplyInt(i) = "1" // pattern matching with unapply is fine
val i = Int.unapply("1").get // implicit conversion is fine
Ama istediğim biri başarısız:
scala> val Int(i) = "1"
<console>:10: error: object Int is not a case class constructor, nor does it have an unapply/unapplySeq method
val Int(i) = "1"
^
örtük dönüştürme çalışmaları ve desen unapply
ile eşleşen ederse Çalışmalar, neden Scala bu iki şeyi örtülü desen eşleştirmesi için bir araya getirmiyor?
Ha! Önerilen çözüm şu anda kullandığım şey. Onunla tamamen mutlu değilim çünkü iki farklı ad alanına sahip olmanızı gerektiriyor, yani aynı yerde Int.MaxValue ve val (Int (i) = "5" 'e sahip olamayacağım anlamına geliyor. – dhg
@dhg True. Ve şimdi bunun hakkında daha fazla düşünüyorum, bence cevabımdaki mantık doğru değil. Asıl neden, kalıp ifadelerinin normal ifadeler gibi olamayacağıdır, çünkü Scala'nın yapıcıların ne olduğunu ve hangi şeylerin değişken olduğunu tanımlaması gerekir ... – Owen
Beni bu son bölümde kaybettin. Cevabınız için – dhg