2016-01-18 6 views
8

मैं जानना चाहता हूं कि जब आप दूसरे तर्क के मान को निर्दिष्ट करना चाहते हैं तो डिफ़ॉल्ट तर्कों के साथ फ़ंक्शन को कॉल करना है। नीचे दिए गए सरल उदाहरण में मैं दिखा रहा हूं कि addTwo() दो तर्क लेता है। 'पहले' तर्क का डिफ़ॉल्ट मान होता है लेकिन दूसरा नहीं होता है। मैं इस फ़ंक्शन को कैसे निर्दिष्ट करूं कि मैं 'प्रथम' के लिए 'दूसरे' के लिए दिए गए मान के साथ 'पहले' के लिए डिफ़ॉल्ट मान का उपयोग करना चाहता हूं?कोटलिन: पहले तर्क के डिफ़ॉल्ट मान का उपयोग करके फ़ंक्शन कॉल कैसे करें और दूसरे के लिए मान गुजरना?

कॉलिंग addTwo (2) एक त्रुटि फेंकता है।

fun main(args: Array<String>) { 
    var sum = addTwo(1,2) // works fine 
    var nextSum = addTwo(2) // ERROR: No value passed for parameter second 
} 

fun addTwo(first: Int = 0, second: Int): Int { 
    return first + second 
} 
+2

आपको अपना त्रुटि संदेश टेक्स्ट प्रश्न में जोड़ना चाहिए, क्योंकि यह महत्वपूर्ण है और कहता है कि त्रुटि क्या है। "पैरामीटर SECOND" –

+0

के लिए कोई मान पास नहीं हुआ है, मैंने एक संपादन में त्रुटि मैसेज जोड़ा है। और निश्चित इंडेंटेशन। –

+3

कोटलिन सीखने के लिए एक साइड नोट, 'वैल' का उपयोग करें जब तक कि आपके पास किसी विशिष्ट मामले के लिए 'var' का उपयोग करने की पूर्ण आवश्यकता न हो, यह डिफ़ॉल्ट नहीं होना चाहिए। 'वैल 'आपका दोस्त है। –

उत्तर

23

यह एक त्रुटि है क्योंकि कोटलिन को यह नहीं पता कि आपने दूसरा पैरामीटर क्यों छोड़ा है। first को डिफॉल्ट किया जा सकता है, लेकिन second नहीं। इसलिए जब आप केवल एक तर्क में पारित होते हैं तो यह पैरामीटर first के लिए था। त्रुटि संदेश दर्शाता है कि वास्तव में क्या समस्या है:

कोई पैरामीटर दूसरा

आप पहली बार डिफॉल्ट पैरामीटर है कि आप खाली छोड़ना चाहते हैं के बाद कुछ भी named arguments का उपयोग कर कॉल करना होगा के लिए भेजे गए मान। आपके मामले के लिए, यह होगा:

addTwo(second = 2) // first defaulted to 0 

था अपने डिफॉल्ट पैरामीटर अन्य आदेश में रहा, अपने कॉल ठीक होगा।

fun addTwo(first: Int, second: Int = 0): Int{ 
    return first + second 
} 

addTow(2) // no error, second defaulted to 0 

, अगर आपके डेटा प्रकारों दो पैरामीटर के लिए अलग कर दिया गया आप एक अलग कम स्पष्ट त्रुटि दे देखा होगा जब आप पहली बार पैरामीटर (Int) के प्रकार पता उम्मीद थी, दूसरे के प्रकार नहीं (Date निम्न उदाहरण में):

fun something(first: Int = 0, second: Date): Date { ... } 

something(Date()) // ERROR: Type mismatch: inferred type is java.util.Date but kotlin.Int was expected 

नोट:आप vararg के साथ एक ही मुद्दे में चला सकते हैं:

केवल एक पैरामीटर vararg के रूप में चिह्नित किया जा सकता है। यदि एक vararg पैरामीटर सूची में अंतिम नहीं है, तो निम्न पैरामीटर के लिए मान नामित तर्क वाक्यविन्यास

1

अतिरिक्त नोट: आपके द्वारा अनुभव किए जाने वाले कारणों के कारण, डिफ़ॉल्ट रूप से डिफ़ॉल्ट रूप से यह सर्वोत्तम अभ्यास है सूची में अंतिम पैरामीटर तर्क। कुछ भाषाएं इसे भी मजबूर करती हैं, जैसे कि पायथन (सिवाय इसके कि पाइथन डिफ़ॉल्ट रूप से डिफ़ॉल्ट नाम के बाद तर्कों को नामित करने की अनुमति देता है, क्योंकि आप उन्हें नाम से कॉल करने के लिए कहते हैं कि आप डिफ़ॉल्ट तर्कों के बाद पैरामीटर को कैसे प्राप्त करेंगे)।

+0

जब आपके पास बहुत से डिफ़ॉल्ट तर्क होते हैं तो आप नामित पैरामीटर का उपयोग करना शुरू कर देते हैं और फिर ऑर्डर बहुत अधिक रोकता है क्योंकि आपको किसी भी डिफ़ॉल्ट पर छोड़ने के लिए नामित तर्कों का उपयोग शुरू करना होगा। –

+1

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

+0

अच्छा अंक। एपीआई स्थिरता के लिए –

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