2010-03-09 18 views
13

असल में, मैं इसका उपयोग करने से पहले एक चर में स्टोर किए बिना एक कस्टम निकालने वाला बनने में सक्षम होना चाहता हूं।क्या एक्स्ट्रेक्टर्स को केस स्टेटमेंट के शरीर में पैरामीटर के साथ अनुकूलित किया जा सकता है (या कहीं और जो एक्स्ट्रेक्टर का उपयोग किया जाएगा)?

यह एक वास्तविक उदाहरण नहीं है कि मैं इसका उपयोग कैसे करूंगा, यह नियमित रूप से अभिव्यक्ति या निर्माण के रूप में कुछ अन्य स्ट्रिंग पैटर्न के मामले में उपयोग किया जाएगा, लेकिन उम्मीद है कि यह बताता है कि मैं क्या देख रहा हूं:

def someExtractorBuilder(arg:Boolean) = new { 
    def unapply(s:String):Option[String] = if(arg) Some(s) else None 
} 

//I would like to be able to use something like this 
val {someExtractorBuilder(true)}(result) = "test" 
"test" match {case {someExtractorBuilder(true)}(result) => result } 

//instead I would have to do this: 
val customExtractor = someExtractorBuilder(true) 
val customExtractor(result) = "test" 
"test" match {case customExtractor(result) => result} 

जब सिर्फ एक कस्टम निकालने कर यह बहुत फर्क नहीं है, लेकिन अगर आप एक मामले बयान के लिए एक्सट्रैक्टर्स की एक बड़ी सूची बना रहे थे, इसके बारे में सभी को अलग करके चीजों को अधिक पढ़ने के लिए मुश्किल बना सकता है उनके उपयोग से निकालने वाले।

मैं उम्मीद करते हैं कि जवाब नहीं आप ऐसा नहीं कर सकते है, लेकिन मैंने सोचा कि मैं चारों ओर पहले से पूछना चाहते हैं: डी

+0

और क्या आपने, उम, * कोशिश की *? स्केला> वैल {someExtractorBuilder (सही)} (परिणाम) = "परीक्षण" :: 1: त्रुटि: –

+0

मैं इसे करने की कोशिश की थी, मैं एक सिंटैक्स त्रुटि प्राप्त सरल पैटर्न वैल के अवैध शुरू {someExtractorBuilder (सही)} (परिणाम) = "परीक्षण" ^ –

+0

आखिरकार आप क्या करने की कोशिश कर रहे हैं? बहुत सारे निकालने वालों की तुलना में ऐसा करने का शायद एक बेहतर तरीका है। –

उत्तर

2

नहीं।

8.1.7 एक्सट्रैक्टर पैटर्न

An extractor pattern x (p 1 , . . . , p n) where n ≥ 0 is of the same syntactic form as a constructor pattern. However, instead of a case class, the stable identifier x denotes an object which has a member method named unapply or unapplySeq that matches the pattern.

7

Parameterising एक्सट्रैक्टर्स शांत होगा, लेकिन हम उन्हें अभी लागू करने के लिए संसाधन नहीं है।

+1

इस तरह के प्रश्नों पर नजर रखने के लिए धन्यवाद :-) – Lutz

1

एक अंतर्निहित पैरामीटर का उपयोग कर कुछ हद तक extractors, इस तरह अनुकूलित कर सकते हैं:

object SomeExtractorBuilder { 
    def unapply(s: String)(implicit arg: Boolean): Option[String] = if (arg) Some(s) else None 
} 

implicit val arg: Boolean = true 
"x" match { 
    case SomeExtractorBuilder(result) => 
    result 
} 

दुर्भाग्य से यह है, जब आप एक match में अलग-अलग रूपों का उपयोग करना चाहते नहीं किया जा सकता सभीके रूप मेंबयान एक ही दायरे में हैं। फिर भी, यह कभी-कभी उपयोगी हो सकता है।