【问题标题】:Not able to reassign value to function parameter,while its not declared as val, val cannot be reassigned无法将值重新分配给函数参数,而其未声明为 val,则无法重新分配 val
【发布时间】:2019-12-03 15:21:49
【问题描述】:

我正在尝试在 kotlin 中编写一个函数,但我无法为函数参数重新分配值,它说 val 无法重新分配。

class WebView{

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

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

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

当我尝试为 url = homepage 分配一个值时。它给了我错误 val cannot be reassigned ,我是 kotlin 的新手,我不明白问题是什么,我们将不胜感激。

【问题讨论】:

标签: android function kotlin


【解决方案1】:

函数参数的作用类似于无法重新分配的val 变量。这里需要添加带条件初始化的变量:

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

顺便说一句,在kotlin中你不需要使用equals函数来比较字符串:普通运算符==会自动替换为字节码中的equals

【讨论】:

  • 您好,感谢您的回答,但我不明白,为什么它不像 java 函数那样工作。如果 url 是可变的,那么为什么我不能给它赋值?
  • 我会说这有点像 kotlin 意识形态。如果它对你来说很有趣,你可以阅读它in this post 和 cmets。
【解决方案2】:

Kotlin M5.1 起,Kotlin 参数是不可变的 (Reference)

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

【讨论】:

    【解决方案3】:

    它给你错误"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】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2020-08-05
          • 2022-07-29
          • 2014-08-07
          • 1970-01-01
          • 2015-05-21
          • 1970-01-01
          • 2013-08-07
          • 1970-01-01
          • 2020-11-04
          相关资源
          最近更新 更多