2010-01-18 10 views
18

मैं तुम्हें एक गुमनाम समारोह बना सकते हैं पता है, और इसकी वापसी प्रकार अनुमान संकलक है:क्या स्कैला में अज्ञात फ़ंक्शन का रिटर्न प्रकार निर्दिष्ट करना संभव है?

val x =() => { System.currentTimeMillis } 

बस स्थिर टाइपिंग की खातिर, यह संभव अपनी वापसी के साथ ही टाइप निर्दिष्ट करने के लिए है? मुझे लगता है कि यह चीजों को बहुत स्पष्ट बना देगा।

उत्तर

27

मेरी राय में आप चीजों को और अधिक स्पष्ट है कि यह एक प्रकार एनोटेशन वहाँ फ़ंक्शन के परिणाम के बजाय जोड़कर पर पहचानकर्ता एक्स उम्मीद दस्तावेज़ के लिए बेहतर है बनाने के लिए कोशिश कर रहे हैं।

val x:() => Long =() => System.currentTimeMillis

तब कंपाइलर यह सुनिश्चित करेगा कि दाईं ओर का कार्य उस उम्मीद को पूरा करेगा।

+0

यह सुनिश्चित नहीं है कि आपके साथ क्या मतलब है * कि बाईं तरफ का कार्य उस उम्मीद को पूरा करता है *, परिणाम ब्लॉक के लिए एक प्रकार निर्धारित करने से यह भी सुनिश्चित होता है कि प्रकार सही है, उदा। 'वैल x =() => {System.currentTimeMillis}: स्ट्रिंग 'संकलित नहीं करता है। या आप कुछ और मतलब है? –

+0

जियोफ़ के उत्तर का लाभ यह है कि आपको पूर्ण प्रकार का फ्रंट मिलता है। यदि आपके पास लंबी (बहु-रेखा) फ़ंक्शन परिभाषा है, तो यह समझने में सबसे तेज़ है कि अगर शुरुआत शुरू हो रही है तो क्या हो रहा है। फैबियन के जवाब में कम दोहराव (एसएसपी। छोटी (एक पंक्ति) परिभाषाओं के लिए अच्छा होने का लाभ है, और यह समझने में तेज़ी से है कि क्या आप पूरी चीज को एक नज़र में डाल सकते हैं)। –

+0

ओह, अब मैं जियोफ के बिंदु को देखता हूं, उसकी टाइप परिभाषा में इनपुट प्रकार होता है, जो यहां '() 'है, और यह तब होता है जब फ़ंक्शन'() => System.currentTimeMillis' को 'x' असाइन किया जाता है। –

37
val x =() => { System.currentTimeMillis } : Long 
+0

इसने मेरी समस्या का समाधान किया। इसने फंक्शन # दृष्टिकोण का उपयोग करने से बहुत कम वर्बोज़ बनाया है। –

+0

'वैल x =() => लांग = {blah}' जैसा लगता है कि एक अधिक सहज वाक्यविन्यास होगा। जवाब के लिए धन्यवाद! – wbarksdale

9

फैबियन सीधा रास्ता दिया, लेकिन चीनी का सूक्ष्म प्रबंधन जैसे कुछ अन्य तरीकों से अगर तुम में शामिल हैं:

val x = new (() => Long) { 
    def apply() = System.currentTimeMillis 
} 

या

val x = new Function0[Long] { 
    def apply() = System.currentTimeMillis 
} 

या यहाँ तक कि

val x = new { 
    def apply(): Long = System.currentTimeMillis 
} 
में के बाद से

ज्यादातर स्थितियों में यह फंक्शन से उतरने पर कोई फर्क नहीं पड़ता, केवल तभी लागू होता है या नहीं।

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