दृश्य के पीछे क्या होता है इसके बारे में कुछ अंतर्दृष्टि यहां दी गई है। इस कोड पर विचार करें:
class Test {
new Object match { case x: Seq[Int] => true }
new Object match { case Seq(1) => true }
}
आप scalac -Xprint:12 -unchecked
साथ संकलन हैं, तो आप सिर्फ विलोपन चरण (आईडी 13) से पहले कोड देखेंगे। पहले प्रकार पैटर्न के लिए, आप की तरह कुछ देखेंगे:
<synthetic> val temp1: java.lang.Object = new java.lang.Object();
if (temp1.isInstanceOf[Seq[Int]]())
Seq
निकालने पैटर्न के लिए, आप की तरह कुछ देखेंगे:
<synthetic> val temp3: java.lang.Object = new java.lang.Object();
if (temp3.isInstanceOf[Seq[A]]()) {
<synthetic> val temp4: Seq[A] = temp3.asInstanceOf[Seq[A]]();
<synthetic> val temp5: Some[Seq[A]] = collection.this.Seq.unapplySeq[A](temp4);
// ...
}
दोनों ही मामलों में, वहाँ एक प्रकार है यह देखने के लिए जांच करें कि क्या वस्तु Seq
(Seq[Int]
और Seq[A]
) है। टाइप पैरामीटर मिटा चरण के दौरान समाप्त हो जाएगा। इस प्रकार चेतावनी। भले ही दूसरा अप्रत्याशित हो, लेकिन इस प्रकार की जांच करने के लिए यह समझ में आता है कि यदि ऑब्जेक्ट Seq
प्रकार नहीं है, तो खंड मेल नहीं करेगा और JVM अगले खंड पर जा सकता है। यदि प्रकार मेल खाता है, तो ऑब्जेक्ट को Seq
और unapplySeq
पर जाया जा सकता है।
आरई: प्रकार की जांच पर थोरज टिप्पणी। हो सकता है कि हम अलग-अलग चीजों के बारे में बात कर रहे हों। मैं केवल कि कह रहे थे:
(o: Object) match {
case Seq(i) => println("seq " + i)
case Array(i) => println("array " + i)
}
की तरह कुछ करने के लिए अनुवाद:
if (o.isInstanceOf[Seq[_]]) { // type check
val temp1 = o.asInstanceOf[Seq[_]] // cast
// verify that temp1 is of length 1 and println("seq " + temp1(0))
} else if (o.isInstanceOf[Array[_]]) { // type check
val temp1 = o.asInstanceOf[Array[_]] // cast
// verify that temp1 is of length 1 and println("array " + temp1(0))
}
प्रकार की जांच प्रयोग किया जाता है तो जब कलाकारों से किया जाता है कि कोई वर्ग डाली अपवाद नहीं है।
चाहे चेतावनी गैर वैरिएबल प्रकार तर्क एक प्रकार पैटर्न में Seq [एक] अनियंत्रित है, क्योंकि यह विलोपन से निकाल दिया जाता है उचित है और क्या वहाँ मामलों में जहां वहाँ के साथ वर्ग डाली अपवाद भी हो सकता है हो सकता है चेक टाइप करें, मुझे नहीं पता।
संपादित करें: यहाँ एक उदाहरण है:
object SeqSumIs10 {
def unapply(seq: Seq[Int]) = if (seq.sum == 10) Some(seq) else None
}
(Seq("a"): Object) match {
case SeqSumIs10(seq) => println("seq.sum is 10 " + seq)
}
// ClassCastException: java.lang.String cannot be cast to java.lang.Integer
एक दिलचस्प ध्यान दें, स्काला पर संस्करण 2.8.1 इस मामले में – thoredge
@thoredge में यह चेतावनी नहीं देता है, मेरा अनुमान है कि 2.9.0 में चेतावनी शायद एक सुधार माना जाता था। मुझे नहीं पता कि यह विशेष मामला पहले से ही था। – huynhjl