2011-03-16 14 views
15

क्या स्कैला में प्रकारों से मिलान करना संभव है? कुछ इस तरह:स्केल में मिलान प्रकार

def apply[T] = T match { 
    case String => "you gave me a String", 
    case Array => "you gave me an Array" 
    case _ => "I don't know what type that is!" 
    } 

(लेकिन उस संकलित, जाहिर है :))

या शायद सही दृष्टिकोण अधिक भार प्रकार है ... संभव है?

दुर्भाग्य से, मैं इसे किसी ऑब्जेक्ट और पैटर्न मिलान का उदाहरण नहीं दे सकता।

उत्तर

21

आप प्रकटवट का उपयोग कर सकते हैं और उन पर एक पैटर्न मैच कर सकते हैं। एरे क्लास को पार करते समय मामला समस्याग्रस्त है, क्योंकि JVM प्रत्येक सरणी प्रकार के लिए एक अलग वर्ग का उपयोग करता है। इस समस्या के समाधान के लिए आप देख सकते हैं कि प्रश्न में प्रकार एक सरणी वर्ग के लिए मिटा दिया जाता है:

val StringManifest = manifest[String] 

def apply[T : Manifest] = manifest[T] match { 
    case StringManifest => "you gave me a String" 
    case x if x.erasure.isArray => "you gave me an Array" 
    case _ => "I don't know what type that is!" 
} 
+3

'क्लासमैनिफेस्ट' तेज है, अगर मिट पर्याप्त है। –

+0

'मैनिफेस्ट' को बहिष्कृत किया गया है। उत्तर की जांच करें: https://stackoverflow.com/a/46706940/1894198 –

17
def apply[T](t: T) = t match { 
    case _: String => "you gave me a String" 
    case _: Array[_] => "you gave me an Array" 
    case _ => "I don't know what type that is!" 
} 
+1

मैं इसे ऑब्जेक्ट का एक उदाहरण पास नहीं कर सकता। –

+2

ऑब्जेक्ट का एक उदाहरण पास करने के लिए, कॉलर से पहले एक चर नाम के साथ अंडरस्कोर को प्रतिस्थापित करें। पूर्व: 'मामला एस: स्ट्रिंग => "आपने मुझे स्ट्रिंग दिया" + s' –

+4

मेरा मतलब था कि मुझे ऑब्जेक्ट के उदाहरण के बिना इसे कॉल करने की आवश्यकता थी, उदाहरण के लिए' लागू करें [स्ट्रिंग] ', जैसा कि लागू होता है (" स्ट्रिंग ")'। –

2

Manifest आईडी पदावनत। लेकिन आप TypeTag

import scala.reflect.runtime.universe._ 

def fn[R](r: R)(implicit tag: TypeTag[R]) { 

    typeOf(tag) match { 
     case t if t =:= typeOf[String] => "you gave me a String" 
     case t if t =:= typeOf[Array[_]] => "you gave me an Array" 
     case _ => "I don't know what type that is!" 
    } 
} 

आशा है कि इससे मदद मिलती है।

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