2015-02-28 8 views
5

कुछ स्थानों (उदा। Form.bindFromRequest) निहित पैरामीटर सूची से पहले एक खाली पैरामीटर सूची का उपयोग करें। क्यूं कर? आईएमएचओ, पैरामीटर स्पष्ट रूप से form.bindFromRequest()(request) में पारित होने पर अतिरिक्त कोष्ठक की आवश्यकता होने का नुकसान होता है। सुनिश्चित नहीं है कि तब लाभ क्या है?स्कैला - निहित सूची से पहले एक खाली तर्क सूची क्यों घोषित की जाती है

+0

आपको इसे बिना किसी लिखने की अनुमति है, नहीं? आईएमओ जो बहुत भ्रमित व्यवहार का कारण बनता है, एक समान पहुंच सिद्धांत के लिए धन्यवाद - एक साधारण संपत्ति पहुंच की तरह दिखने से मनमाने ढंग से जटिल चीजें हो सकती हैं। – lmm

+0

@lmm आप खाली पैरामीटर सूची के बिना यह वही विधि लिख सकते हैं (या फिर आरईपीएल में एक सरसरी प्रयास कहता है)। क्लास कन्स्ट्रक्टरों को स्वचालित रूप से एक खाली पैरामीटर सूची दी जाती है यदि केवल निहितार्थ परिभाषित किए जाते हैं, लेकिन विधियां उनके बिना ठीक काम करने लगती हैं। क्या ऐसा करने का अच्छा विचार है, मुझे नहीं पता। –

+0

यह भी ध्यान दें कि यद्यपि विधि को निहित तर्कों से पहले एक खाली तर्क सूची के साथ परिभाषित किया गया है, फिर भी आप इसे कंपाइलर से किसी भी चेतावनी के बिना 'form.bindFromRequest' की तरह आमंत्रित कर सकते हैं।तो सबसे अधिक संभवतः समारोह को परिभाषित करते समय सम्मेलन का पालन करना बेहतर होता है लेकिन जब आप को आमंत्रित करते हैं तो आप ब्रैकेट को छोड़ सकते हैं (यदि विधि का कोई साइड इफेक्ट नहीं है, क्योंकि स्टाइल गाइड के मुताबिक ब्रैकेट को यह स्पष्ट करने के लिए बेहतर है कि एक साइड इफेक्ट इस समारोह को बुलाकर हो रहा है)। –

उत्तर

1

पैरामीटर सूची के साथ def कोई पैरामीटर सूची वाला एक अलग प्रकार है। यह प्रत्यक्ष आमंत्रण के तहत कोई फर्क नहीं पड़ता है, लेकिन यदि आप उस विधि को किसी अन्य विधि के तर्क के रूप में पास करते हैं, तो यह करता है।

उदाहरण में, यदि आप ऐसा तरह अपने विधि को परिभाषित:

def func1 = { println("Hello"); 1 } 

आप इसे इस विधि को पारित नहीं कर सकते हैं:

def consume(f:() => Double) = // ... 

यह है के रूप में प्रकार, बस डबल है एक बहुत ही आलसी यद्यपि एक। दूसरी ओर इस समारोह ठीक काम करेगा:

def func2() = { println("Hello"); 2 } 

मैं यह नहीं कह रहा हूँ यह स्पष्ट कारण है कि वे इसे किया था, लेकिन अगर वे एक वास्तविक कारण था, यह लगभग निश्चित रूप से टाइप करने के लिए जोड़ दी जाएंगी।

संपादित करें:

व्यावहारिक दृष्टि से उन दोनों के बीच अंतर यह ज्यादातर जहां वे इस्तेमाल किया जा सकता करने के लिए नीचे आता है।

कॉल-बाय-वैल्यू आइटम केवल फ़ंक्शन/विधि (afaik) पर पैरामीटर सूची में उपयोग किया जा सकता है। चूंकि इसे केवल पैरामीटर सूची में ही पारित किया जा सकता है, इसलिए आप इसे एक चर में संग्रहीत नहीं कर सकते हैं और इसे एकाधिक स्थानों में उपयोग नहीं कर सकते हैं (इसे T के स्पष्ट उदाहरण में बदलने के बिना)।

और जैसा कि आप यहाँ देख सकते हैं, वे परस्पर विनिमय दर असल नहीं हैं:

scala> def f(s: => String) { println(s) } 
f: (s: => String)Unit 

scala> def s1 =() => { "Hello" } 
s1:() => String 

scala> f(s1) 
<console>:10: error: type mismatch; 
found :() => String 
required: String 
       f(s1) 
       ^

तो कल्पना मैं कॉलबैक है कि उपयोगकर्ताओं को मेरे पास से गुजरती हैं की एक सरणी स्टोर करने के लिए करना चाहता था .. मैं यहाँ => T उपयोग नहीं कर सकते :

scala> val a: Array[=> Int] = Array() 
<console>:1: error: identifier expected but '=>' found. 
     val a: Array[=> Int] = Array() 
        ^

scala> val a: Array[() => Int] = Array() 
a: Array[() => Int] = Array() 

तो अगर मैं ऐसी वस्तुओं की दुकान, और उन्हें आंतरिक रूप से चारों ओर से पारित, => T का उपयोग कर (और यह lazily का मूल्यांकन रखते हुए) करना चाहते हैं एक विकल्प नहीं है।

मुझे लगता है कि =>=> T और () => T में एक ही चीज़ के रूप में नहीं सोचना सबसे अच्छा है। आशा है इससे थोडी मदद मिलेगी।

+0

सच है, लेकिन आप 'डीई उपभोग (एफ: => डबल) ' के रूप में उपभोग को परिभाषित कर सकते हैं जो आपके उपभोग के बराबर है, है ना? –

+0

वह नाम पैरामीटर द्वारा एक पास है जो फ़ंक्शन 1 नहीं है। –

+0

क्षमा करें, मेरा मतलब है Function0। –

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