如何在函数Kotlin中将瓦尔改为var

iq0todco  于 2023-04-12  发布在  Kotlin
关注(0)|答案(3)|浏览(121)

我是Kotlin的新手。我在编写一个改变布尔值的函数时遇到了问题。

fun main () {

    var x = false

    functionWithBoolean(variable = x)

}

fun functionWithBoolean(variable: Boolean) {

    if (variable){
        println("x is true, so I switch to false")
        variable = false //value of x should be changed from true to false
    }

    else if (variable == false){
        println("x is false, so I switch to true")
        variable = true //value of x should be changed from false to true
    }

}

我遇到的错误:Kotlin:瓦尔不能被重新分配
请解释如何使“变量”变量,虽然x是设置为变量。

pkmbmrz7

pkmbmrz71#

var x = false

在此x可以重新分配
但是当你把值作为参数传递给functionWithBoolean时,你传递的是引用,所以即使你改变了它,它也不会改变源代码。
然而,如果你通过这个简单的改变将值作为返回值传递回去,你将实现你想要的:

fun main () {
        var x = false

        x = functionWithBoolean(variable = x)
    }

    fun functionWithBoolean(variable: Boolean): Boolean {

        if (variable){
            println("x is true, so I switch to false")
            return false //value of x should be changed from true to false
        }

        else{ // you don't need:  if (variable == false)
            println("x is false, so I switch to true")
            return true //value of x should be changed from false to true
        } 

    }
p4rjhz4m

p4rjhz4m2#

通过将变量x传递到函数中,你是按值传递,而不是按引用传递,你可以想象传递了一个副本。你可能会找到一个解决方案here(同样的问题,发布于2017年3月1日)或here,但通常你不会改变函数的参数值。
source

vlju58qv

vlju58qv3#

要改变一个函数中的变量,你必须传递一个实际的变量设置器,而不仅仅是变量的值。所以你必须给予你的函数一个变量设置参数。这只是一个例子,你可以实际实现这一点。在大多数情况下,这将被认为是复杂的设计。
我将“variable”改为“input”是因为将函数参数称为变量是没有意义的。你不能直接传递变量,只能传递值。

fun main () {

    var x = false

    functionWithBoolean(input = x, useNewValue = { x = it })

}

fun functionWithBoolean(input: Boolean, useNewValue: (Boolean)->Unit) {

    if (input){
        println("x is true, so I switch to false")
        useNewValue(false)
    }

    else if (input== false){
        println("x is false, so I switch to true")
        useNewValue(true)
    }

}

这种设计是复杂和容易出错的,所以通常你会简单地从函数返回一个新值,并将其分配给你的变量:

fun main () {

    var x = false

    x = functionWithBoolean(input = x)

}

fun functionWithBoolean(input: Boolean): Boolean {

    return if (input){
        false
    }

    else {
        true
    }

}

或者更简单地说:

fun functionWithBoolean(input: Boolean): Boolean {
    return !input
}

相关问题