2017-02-12 7 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

Решение, которое будет работать для свойств, - это написать функцию расширения для изменяемых свойств, а затем использовать ее со ссылкой на свойство. Этот код работа с Котлин 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)

Это, однако, не будет работать для локальных переменных (по крайней мере, не в Котлин 1.1).


В Котлин 1.0.x, bound callable references еще не доступны, и решение выше можно переписать это несколько неуклюжий код:

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 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^