2012-07-27 12 views
5

मैं एक ऐसा फ़ंक्शन लिखना चाहता हूं जो इसके प्रकार पैरामीटर के आधार पर अलग-अलग व्यवहार करता हो। जो मैं चाहता की एक सरल उदाहरण नीचे दिखाया गया है:क्या मैं स्कैला में फ़ंक्शन प्रकार पैरामीटर का विशेषज्ञ कर सकता हूं जैसे कि मैं सी ++ टेम्पलेट विशेषज्ञता के साथ कर सकता हूं?

def f[Int] = "I'm an int" 
def f[Float] = "I'm a float" 
def f[Burger] = "You want fries with that?" 

स्काला में यह संभव है या मैं आसपास काम किसी तरह का क्या ज़रूरत है?

उत्तर

14

सीधे नहीं; स्कैला में ऐसा करने का सामान्य तरीका एक टाइपक्लास के साथ है।

trait FAble[T] { def doF: String } 
object FAble { 
    implicit val fInt = new FAble[Int] { def doF = "I'm an int" } 
    implicit val fFloat = new FAble[Float] { def doF = "I'm a float" } 
    implicit val fBurger = new FAble[Burger] { def doF = "You want fries?" } 
} 

def f[T](implicit ev: FAble[T]) = ev.doF 
// or 
def f[T: FAble] = implicitly[FAble[T]].doF 

यह एक निष्पक्ष थोड़ा और अधिक वर्बोज़ है, लेकिन यह कुछ फायदे भी है - अंतर्निहित उदाहरणों (val रों बजाय implicit def s का उपयोग करके) गणना की जा सकती है, और वहाँ किसी भी प्रकार के लिए एक से अधिक उदाहरण हो सकता है , जो आपको कोड के विभिन्न बिंदुओं पर दायरे में अलग-अलग उदाहरणों के साथ व्यवहार का चयन करने देता है।

कारण यह नहीं है कि आप इसे C++ तरीके से नहीं कर सकते हैं कि स्कैला जेनेरिक में विभिन्न प्रकार-पैरामीटर (@specialized एक तरफ कोड कोड शामिल नहीं है, क्योंकि यह वही नहीं करता है जो आप चाहते हैं)। इसलिए यह कहना समझ में नहीं आता है कि "हे कंपाइलर, जब आप जेनेरिक टेम्पलेट से कोड उत्पन्न करने के बजाय उस स्थिति में एक इंट देखते हैं, तो इसके बजाय इस विशिष्ट कोड का उपयोग करें"।

1

आप मैक्रोज़ में देखना चाहते हैं: http://scalamacros.org/। मैक्रोज़ कस्टम फ़ंक्शंस हैं जो संकलन के दौरान चलाए जाते हैं और संकलन-समय कंप्यूटेशंस के आधार पर गतिशील रूप से कोड उत्पन्न कर सकते हैं।

2

एक अन्य संभावित दृष्टिकोण आप सबूतों का उपयोग करना है:

def f[T](t:T)(implicit ev: T<:<Float) { 

// float version 

} 

def f[T](t:T)(implicit ev: T<:<Int) { 

// int version 

} 

हालांकि मैं एक और अधिक सुरुचिपूर्ण समाधान के रूप में प्रकार कक्षाओं की सिफारिश करेंगे

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

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