Kotlin function parameter: Val cannot be reassigned

前端 未结 3 1472
一生所求
一生所求 2020-12-03 13:26

I have written Red–black tree in Kotlin. Fun insertFixup restores balance after inserting new element (z: Node? is new element). Algorithm of tree balancin

3条回答
  •  死守一世寂寞
    2020-12-03 13:58

    Kotlin function parameters are read-only values and are not assignable.

    You can however create a ReadWriteProperty object to pass to insertFixup for getting/setting newNode:

    ...
    class BinarySearchTree {
    ...
        fun insertFixup(zProperty: ReadWriteProperty) {
            var z by zProperty
    ...
    
    fun main(args: Array) {
        val bst = BinarySearchTree()
    
        var newNode: Node? = null
        val newNodeProperty = object : ReadWriteProperty {
            override operator fun getValue(thisRef: Any?, property: KProperty<*>): Node? {
                return newNode
            }
    
            override operator fun setValue(thisRef: Any?, property: KProperty<*>,
                                           value: Node?) {
                newNode = value
            }
        }
    
        while (true) {
            newNode = Node(readLine()!!.toInt())
            bst.insert(newNode!!)
            bst.insertFixup(newNodeProperty)
        }
    }
    

    And if you are willing to use a property instead of a variable then you can use a property reference for getting/setting newNode from insertFixup instead:

    ...
    class BinarySearchTree {
    ...
        fun insertFixup(zProperty: KMutableProperty0) {
            var z by zProperty
    ...
    
    var newNode: Node? = null
    
    fun main(args: Array) {
        val bst = BinarySearchTree()
    
        while (true) {
            newNode = Node(readLine()!!.toInt())
            bst.insert(newNode!!)
            bst.insertFixup(::newNode)
        }
    }
    
    // the following allow `KMutableProperty0` to be used as a read/write delegate
    operator fun  KProperty0.getValue(thisRef: Any?, property: KProperty<*>): T = get()
    operator fun  KMutableProperty0.setValue(thisRef: Any?, property: KProperty<*>, 
                                                   value: T) = set(value)
    

提交回复
热议问题