2013-08-28 13 views
13

कोई इस कोडक्या इस स्केला प्रतीक -> _ का मतलब

case "Foo" Foo(data) -> _ => { /*.. implementation */} 

मैं Foo.unapply (डेटा) का उपयोग देखने समझने मुझे सहायता कर सकते हैं, लेकिन मुझे समझ नहीं आता क्या इस हिस्से

-> _

कैसे और कब इसका इस्तेमाल करने

+0

एक लोकप्रिय सवाल है जो आपकी समस्या को भी कवर करता है http://stackoverflow.com/questions/7888944/scala-punctuation-aka-symbols-and-operators –

+1

बीटीडब्ल्यू अगर आप intellij http का उपयोग करते हैं तो आप आसानी से इस कोड को समझ सकते हैं: //gyazo.com/dcf31d20ccb925bed0e302fd45df7710.png या यदि आप इसे स्कैला एक्स-रे के साथ संसाधित करते हैं http://scastie.org/2026 – OlegYch

उत्तर

26

यह लो किसी की तरह ओक्स रास्ता अपने स्वयं के अच्छे के लिए बहुत चालाक है।

case class Foo[A](command: String, data: A) 

object -> { def unapply[A, B](p: (A, B)) = Some(p) } 

अब मैं यह लिख सकते हैं: मान लीजिए मैं निम्नलिखित मिल गया है

Foo("foo", (42, 'whatever)) match { 
    case Foo("foo", data -> _) => data 
} 
: स्काला के इन्फ़िक्स पैटर्न का जादू करने के लिए

scala> Foo("foo", (42, 'whatever)) match { 
    | case "foo" Foo(data) -> _ => data 
    | } 
res0: Int = 42 

धन्यवाद, यह निम्नलिखित के बराबर है

सिवाय इसके कि इन्फिक्स संस्करण को आपके कोड के भविष्य के पाठकों को भ्रमित करने और परेशान करने की गारंटी है।

+1

+1 क्योंकि आप तुरंत मामले को समझते हैं। और स्कैला जादू –

+1

वाह के लिए। मुझे नहीं पता था कि संकलक _that_ ट्रांसफॉर्म कर सकता है - माता-पिता के अंदर '-> _' को ले जा रहा है, अनिवार्य रूप से? या यह नहीं है कि क्या हो रहा है? –

+2

@RexKerr: ब्रांड्स वास्तव में यहां कोई काम नहीं कर रहे हैं-आप बस भी कर सकते हैं (यानी, भयभीत) 'केस "foo" Foo डेटा -> _' लिखें। –

संबंधित मुद्दे