2012-01-10 4 views
7

मैं कार्रवाई में एक किताब लिफ्ट के माध्यम से जा रहा हूँ और मैं कुछ मैं काफी समझ में नहीं आता का सामना करना पड़ा: _ ::_ :: स्कैला में क्या मतलब है?

object permanent_link extends MappedString(this, 150){ 
    override def validations = 
    valMinLen(3, "Link URL must be at least 5 characters") _ :: 
    super.validations 
} 

मैं किसी भी संकेत नहीं मिल रहा है तो मैं अगर कोई मदद कर सकता है आभारी होंगे मुझे बाहर ..

उत्तर

18

मुझे लिफ्ट नहीं पता, लेकिन यह एक सामान्य सवाल है। सबसे पहले, :: एक स्काला विपक्ष ऑपरेटर है:

scala> 1 :: 2 :: List(3, 4) 
res0: List[Int] = List(1, 2, 3, 4) 

इसका मतलब है कि super.validations एक दृश्य में किसी प्रकार का है और valMinLen(3, "Link URL must be at least 5 characters") _ कि सूची में एक भी मूल्य है।

संदर्भ में यह स्पष्ट लग रहा है कि ओवरराइड validations विधि में वे super संस्करण बुला रहे हैं से और शुरुआत में कुछ अतिरिक्त सत्यापन पहले जोड़ें।

यह अतिरिक्त सत्यापन valMinLen() पर कॉल द्वारा बनाया गया है। हालांकि यह अतिरिक्त कॉल validations सूची के प्रकार से मिलान करने वाला तत्व वापस नहीं करता है - लेकिन एक फ़ंक्शन। फ़ंक्शन वैल्यू को प्रीपेड करने के बजाय हम स्पष्ट रूप से कह रहे हैं (_ प्रत्यय` जोड़कर) कि हम फ़ंक्शन को प्रीपेड करना चाहते हैं, न कि उस फ़ंक्शन का रिटर्न वैल्यू।

scala> def f = 3 
f: Int 

scala> def g = 4 
g: Int 

scala> val listOfInts = List(f, g) 
listOfInts: List[Int] = List(3, 4) 

scala> val listOfFunctions = List(f _, g _) 
listOfFunctions: List[() => Int] = List(<function0>, <function0>) 

listOfInts और listOfFunctions के प्रकार की तुलना करें:

कोड स्निपेट एक हजार शब्दों के लायक है। मेरा मानना ​​है कि f _ वाक्यविन्यास को स्केल दुनिया में आंशिक रूप से लागू फ़ंक्शन कहा जाता है।

5

अंडरस्कोर यह समझता है कि valMinLen को कॉल नहीं किया जाना चाहिए लेकिन फ़ंक्शन "पॉइंटर" के रूप में उपयोग किया जाना चाहिए।

:: ऑपरेटर सूचियों को जोड़ता है।

यह दूसरे शब्दों में होगा कोड की तरह लग एक सूची validations कि valMinLen करने के लिए एक समारोह "सूचक" से मिलकर मानकों के साथ दिया जाता है और सूची के बाकी super.validations का मूल्य है बनाता है, कि सुपर क्लास 'सत्यापन है ।

मुझे यकीन है कि किसी ने मेरे शब्दावली यहाँ :)

0

कोड कुछ उचित खरोज के साथ अधिक पठनीय हो सकता है सही कर देंगे कर रहा हूँ और एक वैल शुरू:

object permanent_link extends MappedString(this, 150) { 

    override def validations = minimumValidation :: super.validations 

    val minimumValidation = valMinLen(3,"Link URL must be at least 5 characters") _ 
} 

तो जैसा कि पहले बताया गया है, :: ऑपरेटर सिर्फ एक सूची में एक नया तत्व पहले जोड़ता, _ इसके साथ कोई संबंध नहीं है और एक समारोह वस्तु प्राप्त करने के लिए प्रयोग किया जाता है की तरह में

(1 :: 2 :: Nil) map (println _) 

जो एक सूची बनाता है [1, 2] और प्रत्येक तत्व के लिए फ़ंक्शन println लागू करता है (अंडरस्कोर वास्तव में यहां छोड़ा जा सकता है)। ऑब्जेक्ट println _println विधि से फ़ंक्शन ऑब्जेक्ट का निर्माण करता है जिसमें _ फ़ंक्शन के एकल पैरामीटर का प्रतिनिधित्व करता है।

+0

तो आप इसे घोषित करने से पहले 'न्यूनतम सत्यापन' का संदर्भ दे सकते हैं? – ziggystar

+0

घोषणापत्र आदेश स्काला में कोई फर्क नहीं पड़ता, यह ज्यादातर मौजूदा भाषाओं में नहीं है। – Ramses

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

  • कोई संबंधित समस्या नहीं^_^