स्काला @ ऑपरेटर


जवाबों:


179

यह एक मिलान पैटर्न को एक चर से बांधने में सक्षम बनाता है। उदाहरण के लिए, निम्नलिखित पर विचार करें:

val o: Option[Int] = Some(2)

आप आसानी से सामग्री निकाल सकते हैं:

o match {
  case Some(x) => println(x)
  case None =>
}

लेकिन क्या होगा अगर तुम नहीं चाहते थे सामग्री की Some, लेकिन विकल्प ही? इस के साथ पूरा किया जाएगा:

o match {
  case x @ Some(_) => println(x)
  case None =>
}

ध्यान दें कि किसी भी स्तर @पर उपयोग किया जा सकता है, न कि केवल मिलान के शीर्ष स्तर पर।


5
प्रलेखन में मुझे वह उत्तर कहां मिलेगा? मुझे लगता है कि वहाँ अन्य अच्छी चीजें वहाँ भी दफन हैं। :)
जिम बैरो

1
@ जीम स्काला संदर्भ, 8.1। 8.12, विशेष रूप से, हालांकि मुझे नहीं पता कि जहां "हमेशा की तरह" वहां से आया था - और 8.12 केवल नियमित अभिव्यक्ति पैटर्न ( _*) की बात करते हैं । लेकिन शायद यह कल्पना के एक नए संस्करण पर स्पष्ट किया गया है।
डैनियल सी। सोबरल

16
मैं यह जोड़ूंगा कि आप शायद इसके @साथ उपयोग नहीं करेंगे Some(_), बल्कि यदि आप सामग्री पर मिलान करना चाहते हैं Some, लेकिन फिर भी कुछ को संदर्भित करते हैं, जैसे case x @ Some(7) => println(x)। जैसा कि मैं व्याख्या करता हूं कि यह case x @ Some(_)सिर्फ एक अधिक वर्बोज़ संस्करण है case x: Some
थियो

2
यह "स्कैला - 2 संस्करण में प्रोग्रामिंग" की धारा 15.2 में "वैरिएबल बाइंडिंग" के तहत भी कवर किया गया है और धारा 26.3 (एक्स्ट्रेक्टर्स पर अध्याय) में फिर से उपयोग किया गया है।
भेड़

@ case x: Someयह अपने आप काम नहीं करता है। आपको उपयोग करना है case x: Some[_], जो कि कोई कम
क्रिया

74

@एक सफलतापूर्वक मिलान किए गए पैटर्न या उपपट्ट पर एक नाम बांधने के लिए इस्तेमाल किया जा सकता है। पैटर्न का उपयोग पैटर्न मिलान, <-समझ के लिए बाएं हाथ की ओर और विनाशकारी वर्गीकरण में किया जा सकता है।

scala> val d@(c@Some(a), Some(b)) = (Some(1), Some(2))
d: (Some[Int], Some[Int]) = (Some(1),Some(2))
c: Some[Int] = Some(1)
a: Int = 1
b: Int = 2

scala> (Some(1), Some(2)) match { case d@(c@Some(a), Some(b)) => println(a, b, c, d) }
(1,2,Some(1),(Some(1),Some(2)))

scala> for (x@Some(y) <- Seq(None, Some(1))) println(x, y)
(Some(1),1)

scala> val List(x, xs @ _*) = List(1, 2, 3) 
x: Int = 1
xs: Seq[Int] = List(2, 3)

10

पैटर्न मिलान जब variable @ patternबांधता चर के अनुरूप मूल्य के पैटर्न अगर पैटर्न से मेल खाता है। इस मामले में इसका मतलब है कि उस केस-क्लॉज में मान का मूल्य xहोगा Some(Nil)


9

आपको किसी पैटर्न के शीर्ष-स्तर से मेल खाने देता है। उदाहरण:

case x @ "three" => assert(x.equals("three"))
case x @ Some("three") => assert(x.get.equals("three")))
case x @ List("one", "two", "three") => for (element <- x) { println(element) }

6
केवल शीर्ष स्तर नहीं।
डैनियल सी। सोबरल

2

यह xउस पैटर्न के मूल्य को निर्धारित करता है जो मेल खाता है। आपके उदाहरण में, xऐसा होगा Some(Nil)(जैसा कि आप कॉल से प्रिंटलाइन पर निर्धारित कर सकते हैं )


1
एक backtick प्रस्तुत करने के लिए iPhones की अक्षमता लानत है!
oxbow_lakes
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.