2017-11-15 15 views
5

मैं कोटलिन में किसी फ़ंक्शन से उसी प्रकार (Int) के 3 अलग-अलग डेटा मान कैसे वापस कर सकता हूं?हम कोटलिन में किसी फ़ंक्शन से कई मान कैसे वापस कर सकते हैं जैसे हम तेजी से करते हैं?

मैं दिन का समय वापस करने का प्रयास कर रहा हूं, मुझे घंटे, मिनट और सेकंड को अलग पूर्णांक के रूप में वापस करने की आवश्यकता है, लेकिन सभी एक ही कार्य से जाते हैं, क्या यह संभव है?

तेज में हम निम्नलिखित की तरह यह कर,

func getTime() -> (Int, Int, Int) { 
    ... 
    return (hour, minute, second) 
} 

हम Kotlin में इस लक्ष्य को हासिल कर सकते हैं?

पीएस: मुझे पता है कि मैं इसके लिए ऐरे या हैशमैप का उपयोग कर सकता हूं लेकिन मैं जानना चाहता हूं कि कोटलिन में कुछ ऐसा है जैसे यह तेजी से है।

data class TimeData(val hour: Int, val minute: Int, val second: Int) 

fun getTime(): TimeData { 
    // do your calculations 

    return TimeData(hour, minute, second) 
} 

// Get the time. 
val (hour, minute, second) = getTime() 
+0

यह जांचें: [यह सरल चाल आपको कोटलिन में एकाधिक रिटर्न देगा।] (https://android.jlelse.eu/this-simple-trick-will-have-you-creating-multiple-returns-in-kotlin-37b9fe2a2f9f) – jayeshsolanki93

उत्तर

8

आप कोटलिन में मनमाने ढंग से टुपल्स नहीं बना सकते हैं, इसके बजाय, आप data classes का उपयोग कर सकते हैं। एक विकल्प Pair और Triple वर्गों में निर्मित सामान्य रूप से निर्मित है और क्रमशः दो या तीन मान रख सकता है। आप destructuring declarations इस तरह के साथ इन संयुक्त उपयोग कर सकते हैं:

fun getPair() = Pair(1, "foo") 

val (num, str) = getPair() 

तुम भी एक List या Array destructure कर सकते हैं, पहली 5 elements करने के लिए:

fun getList() = listOf(1, 2, 3, 4, 5) 

val (a, b, c, d, e) = getList() 

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

data class Time(val hour: Int, val minute: Int, val second: Int) 

fun getTime(): Time { 
    ... 
    return Time(hour, minute, second) 
} 

val (hour, minute, second) = getTime() 
0

आप एक से अधिक मान लौट सकते हैं और अधिक के लिए इस documentation

नीचे देखें

data class Result(val result: Int, val status: Status) 
fun function(...): Result { 
    // computations 

    return Result(result, status) 
} 

// Now, to use this function: 
val (result, status) = function(...) 

से पता चला की तरह:

0

कोटलिन में कोई टुपल नहीं है। वैकल्पिक रूप से, आप data classdestructuring declaration के साथ उपयोग कर सकते हैं।

data class Time(val hour: Int, val minute: Int, val second: Int) 

func getTime(): Time { 
    ... 
    return Time(hour, minute, second) 
} 

//Usage 
val time = getTime() 
println("${time.hour}:${time.minute}:${time.second}") 
//Or 
val (hour, minute, second) = getTime() 
println("${hour}:${minute}:${second}") 

आप प्रत्येक विशिष्ट मामले के लिए डेटा वर्ग बनाने के लिए नहीं करना चाहते हैं, तो आपको कुछ सामान्य डेटा वर्गों बना सकते हैं और स्पष्टता के लिए typealias उपयोग कर सकते हैं।

data class Two<A, B>(val a: A, val b: B) 
data class Three<A, B, C>(val a: A, val b: B, val c: C) 
data class Four<A, B, C, D>(val a: A, val b: B, val c: C, val d: D) 
... 

typealias Time = Three<Int, Int, Int> 

लेकिन, जाहिर है, नुकसान यह है कि आप क्रम में यह एक उचित संपत्ति नाम देने के लिए destructuring घोषणा का इस्तेमाल करते हैं चाहिए।

val time = getTime() 
println("${time.a}:${time.b}:${time.c}") 

val (hour, minute, second) = getTime() //destructuring declaration 
println("${hour}:${minute}:${second}") 
0

ऐसा लगता है कि आप समय को संभालने के लिए एक विशिष्ट वर्ग बनाने के स्पष्ट उत्तर से अवगत हैं। तो मुझे लगता है कि आप कक्षा बनाने, या सरणी के प्रत्येक तत्व को एक्सेस करने की छोटी परेशानी से बचने की कोशिश कर रहे हैं और अतिरिक्त कोड के मामले में सबसे कम समाधान की तलाश में हैं।मेरा सुझाव है:

fun getTime(): Triple<Int, Int, Int> { 
    ... 
    return Triple(hour, minute, second) 
} 

और विखंडन के साथ उपयोग करें:

var (a, b, c) = getTime() 

आप 4 या 5 वापसी मूल्यों की जरूरत है (यदि आप अधिक से अधिक 5 deconstruct नहीं कर सकते हैं), Array साथ जाना:

fun getTime(): Array<Int> { 
    ... 
    return arrayOf(hour, minute, second, milisec) 
} 

और

var (a, b, c, d) = getTime() 

पीएस: आप var (a, b) = getTime() जैसे डीकोनस्ट्रक्चर करते समय मानों की तुलना में कम चर का उपयोग कर सकते हैं, लेकिन आप अधिक उपयोग नहीं कर सकते हैं या आपको ArrayIndexOutOfBoundsException

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

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