2017-02-12 9 views
6

मेरे मामले में मैं एक आदिम बदलना चाहते हैं - बूलियनक्या कोई एक्सटेंशन फ़ंक्शन लिखने का कोई तरीका है जो ऑब्जेक्ट के मान को बदलता है?

मैं कोड की निम्न प्रकार पसंद आया कभी नहीं:

private var firstTime: Boolean = true 
... 

    if (firstTime) { 
     // do something for the first time here 
     firstTime = false 
    } 

अच्छा होगा अगर मैं जैसा कोई एक्सटेंशन समारोह हो सकता है:

if (firstTime.checkAndUnset()) { 
    // do something for the first time here 
} 

क्या यह संभव है?

+2

के रूप में सरल उपयोग यह एक प्रयोग मामले में जहां एक [आलसी प्रतिनिधि] (https://kotlinlang.org/docs/reference/delegated-properties.html#lazy) में मदद मिलेगी है? –

उत्तर

6

गुणों के लिए काम करने वाला एक समाधान म्यूटेबल गुणों के लिए एक एक्सटेंशन फ़ंक्शन लिखना है और फिर इसे संपत्ति संदर्भ के साथ उपयोग करना है। Kotlin 1.1 के साथ इस कोड काम:

fun KMutableProperty0<Boolean>.checkAndUnset(): Boolean { 
    val result = get() 
    set(false) 
    return result 
} 

उपयोग:

class MyClass { 
    private var firstTime = true 

    fun f() { 
     if (this::firstTime.checkAndUnset()) { 
      println("First time") 
     } 
    } 
} 

fun main(args: Array<String>) { 
    val c = MyClass() 
    c.f() // First time 
    c.f() // 
} 

(check the runnable demo)

लेकिन यह स्थानीय चर के लिए काम नहीं करेगा (कम से कम Kotlin 1.1 में नहीं)।


Kotlin 1.0.x में, bound callable references अभी तक उपलब्ध नहीं हैं, और समाधान के ऊपर यह कुछ हद तक clumsier कोड को फिर से लिखा जा सकता है:

fun <T> KMutableProperty1<T, Boolean>.checkAndUnset(receiver: T): Boolean { 
    val result = get(receiver) 
    set(receiver, false) 
    return result 
} 

MyClass::firstTime.checkAndUnset(this) 
1

बस बनाने निम्नलिखित संपत्ति

private var firstTime: Boolean = true 
    get() { 
     return if (field) { //Note: field - is keyword in current context 
      field = false 
      true 
     } else false 
    } 
    set(v) { field = v } 

और जैसा कि

if (firstTime) { 
    //It's first time 
    //firstTime is false now 
} 
संबंधित मुद्दे

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