2011-10-08 15 views
22

मैं वर्तमान में स्कैला में अपना पहला कदम बना रहा हूं इसलिए मैं आम समस्याओं के करीब आने में सर्वोत्तम प्रथाओं की तलाश में हूं। निम्नलिखित कोड है जो काम नहीं करता है लेकिन यह वर्णन करता है कि मैं क्या करना चाहता हूं। क्या आप इस समस्या के सर्वोत्तम दृष्टिकोण की सिफारिश कर सकते हैं?स्कैला स्ट्रिंग पैटर्न सर्वोत्तम अभ्यास से मिलान

case url if url.startsWith("jdbc:mysql:") => "com.mysql.jdbc.Driver" 

यह केवल पैटर्न अभिव्यक्ति (जो भी url है) के लिए मूल्य url बांधता है और एक गार्ड को जोड़ता है:

def resolveDriver(url: String) = { 
    url match { 
     case url.startsWith("jdbc:mysql:") => "com.mysql.jdbc.Driver" 
     case url.startsWith("jdbc:postgresql:") => "org.postgresql.Driver" 
     case url.startsWith("jdbc:h2:") => "org.h2.Driver" 
     case url.startsWith("jdbc:hsqldb:") => "org.hsqldb.jdbcDriver" 
     case _ => throw new IllegalArgumentException 
    } 
    } 
+2

भी देखें [इस सवाल] (http://stackoverflow.com/q/7586605/53013) इस समस्या को हल करने के लिए के लिए एक और तरीका है, यदि मिलान किया गया हिस्सा संपूर्ण प्रोटोकॉल होता है। –

उत्तर

39

वाक्य रचना के संदर्भ में, तुम सिर्फ एक छोटा सा आप मामले बयान संशोधित कर सकते हैं एक परीक्षण के साथ अभिव्यक्ति। कोड को संकलित करना चाहिए।

यह थोड़ा और अधिक स्केला की तरह बनाने के लिए, आप एक विकल्प [स्ट्रिंग] वापस कर सकते हैं (मैं एक जोड़े को खंड हटाया के बाद से यह सिर्फ उदाहरण के लिए है):

def resolveDriver(url: String) = url match { 
    case u if u.startsWith("jdbc:mysql:") => Some("com.mysql.jdbc.Driver") 
    case u if u.startsWith("jdbc:postgresql:") => Some("org.postgresql.Driver") 
    case _ => None 
} 

है यही कारण है कि जब तक आप प्रबंधित करना चाहते हैं अपवाद नहीं।

+0

धन्यवाद! यही वही है जो मैं ढूंढ रहा था! मुझे खुशी है कि मैंने सवाल पूछा 'cuz मैं इसके लिए एक केस क्लास बनाने के लिए खुद को तैयार कर रहा था, जो एक अधूरापन की तरह गंध लगा। अपवाद फेंकने पर मुझे सही करने के लिए भी मैं आपको धन्यवाद देता हूं। –

10

यहां एक वैकल्पिक तरीका है। मानचित्र में सभी मैपिंग स्टोर करें और फिर मैच खोजने के लिए collectFirst विधि का उपयोग करें। collectFirst प्रकार हस्ताक्षर है:

def TraversableOnce[A].collectFirst[B](pf: PartialFunction[A, B]): Option[B] 

उपयोग:

scala> val urlMappings = Map("jdbc:mysql:" -> "com.mysql.jdbc.Driver", "jdbc:postgresql:" -> "org.postgresql.Driver") 
urlMappings: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map(jdbc:mysql: -> com.mysql.jdbc.Drive 
r, jdbc:postgresql: -> org.postgresql.Driver) 

scala> val url = "jdbc:mysql:somestuff" 
url: java.lang.String = jdbc:mysql:somestuff 

scala> urlMappings collectFirst { case(k, v) if url startsWith k => v } 
res1: Option[java.lang.String] = Some(com.mysql.jdbc.Driver) 
+0

धन्यवाद लेकिन क्या आप 'मैच' पर एक अमूर्तता का प्रस्ताव नहीं करते हैं? –

+0

@mojojojo: बिल्कुल नहीं। 'मैच' के बाद 'केस' अभिव्यक्तियों का सेट' आंशिक फ़ंक्शन 'का गठन करता है। 'collectFirst' एक ऐसी विधि है जो' आंशिक फ़ंक्शन 'स्वीकार करती है, संग्रह पर लूप करती है, और' कुछ 'में लिपटे गए पहले मैच को वापस लौटाती है। (यदि कोई मिलान नहीं मिला तो 'कोई नहीं' लौटाता है।) – missingfaktor

+0

@mojojojo: स्रोत देखें: http://goo.gl/Q4UNz – missingfaktor

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