无法将值重新分配给函数参数,而未将其声明为val,则无法重新分配val

时间:2019-07-25 11:00:24

标签: android function kotlin

我试图用kotlin编写函数,但无法将值重新分配给函数参数,它说val无法重新分配。

class WebView{

    var homepage = "https://example.com"

    fun webViewLoad(url: String, preferredOrientation: String) {

            if (url.equals("homepage")){
                url = homepage
            }
        }
    }

当我尝试给url = homepage赋值时,它给我报错val无法重新分配,我是kotlin的新手,我不明白这是什么问题,几乎没有帮助。

5 个答案:

答案 0 :(得分:2)

函数参数的工作方式类似于val变量,无法重新分配。在这里,您需要使用条件初始化添加变量:

fun webViewLoad(url: String, preferredOrientation: String) {
    val urlValue = if (url.equals("homepage")){
        homepage
    } else {
        url
    }
    ... //use here "urlValue" variable
}

顺便说一句,在kotlin中,您无需使用equals函数来比较字符串:通用操作符==将在字节码中自动替换为equals

答案 1 :(得分:2)

Kotlin M5.1 起,

Kotlin参数是不可变的  (Reference

  

主要原因是这令人困惑:人们倾向于认为这意味着通过引用传递参数,我们不支持该参数(在运行时代价很高)。另一个混乱的根源是主要的构造函数:构造函数声明中的“ val”或“ var”意味着与函数声明(即,它创建属性)不同。另外,我们都知道,改变参数不是好的样式,因此在函数中在参数的前面写入“ val”或“ var”,不再允许for循环的catch块。

答案 2 :(得分:1)

Kotlin函数参数是最终的。没有val或final关键字,因为这是默认关键字(并且不能更改)。看看this

答案 3 :(得分:0)

这会给您带来错误"val cannot be reassigned",因为Kotlin函数参数为immutable i.e "val" by default.,因此您无需提及"val" keyword

快速解决方案是:

class WebView{

    var homepage = "https://example.com"

    fun webViewLoad(url: String, preferredOrientation: String) {
            val finalUrl = if (url.equals("homepage")) homepage else url
        }
    }

答案 4 :(得分:0)

该函数中传递的默认参数是最终的,您可以做的就是添加var。希望对您有所帮助。

fun webViewLoad(var url: String, preferredOrientation: String) {

            if (url.equals("homepage")){
                url = homepage
            }
        }