我是新手。我有一个问题,使一个函数,改变布尔值。
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: Val不能被重新分配
请解释如何制作"变量"。
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
}
}
要更改函数中的变量,必须传递一个实际的变量设置器,而不仅仅是变量的值。所以你必须给你的函数一个可变参数。这只是一个如何实现这一目标的例子。在大多数情况下,这将被认为是复杂的设计。
我改变了变量";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
}
通过将变量x传递给函数,您是按值传递,而不是按引用传递,您可以想象传递的是一个副本。你可能会在这里找到一个解决方案(同样的问题,发布2017年3月1日)或在这里,但通常你不会改变函数的参数值。
来源我发现其他答案有点正确,val不能直接重新分配,并且有一些有效的解决方案。我还发现带有var属性的东西可以改变这些属性,并且它们在函数之外保持不变。
包括Array, List和doubleray。在一个函数中,array[0]可以被改变和使用,但你不能给array赋值,除非它是某个东西的var属性,为了简单起见,请使用布尔数组。
fun main () {
var x = BooleanArray(1){false};
functionWithBoolean(x)
}
fun functionWithBoolean(variable: BooleanArray) {
if (variable[0]){
println("x is true, so I switch to false")
variable[0] = false //value of x should be changed from true to false
}
else if (variable[0] == false){
println("x is false, so I switch to true")
variable[0] = true //value of x should be changed from false to true
}
}