【问题标题】:Can't reuse function parameters [duplicate]不能重用函数参数[重复]
【发布时间】:2018-01-09 22:18:41
【问题描述】:

我正在尝试像这样重用函数参数

fun test(i: Int) {
    i += 5
}

但如this distinction 中所述

函数参数是val而不是var

【问题讨论】:

  • 真的,修改参数通常被认为是不好的做法。我会创建一个具有不同名称的新变量,将其分配给参数,然后使用它。另外,您可以将参数声明为var吗?
  • @Carcigenicate 您不能在 Kotlin 中将函数参数指定为 val/var。它们隐含为 val
  • 为什么它被认为是一种不好的做法我不想更改外部范围内的参数只是为了避免分配它。我认为 assign 更令人困惑,

标签: kotlin


【解决方案1】:

在 Kotlin 中,函数参数被视为 val。这意味着你必须在你的函数内部做一些事情才能“修改”它的引用。

您的解决方案会起作用,但我觉得隐藏变量是一种不好的做法。它会导致混淆,并且不能完全准确地涵盖您理解的效果是函数局部的意图。

我会选择这样的:

fun test(i: Int) {
    var i2 = i
    i2 += 3 // etc...
}

【讨论】:

  • 我已经考虑过了,但在我的情况下,参数名称是宽度和高度。而且我觉得重命名它会导致代码可读性降低。
【解决方案2】:

我找到的唯一解决方案是使用名称阴影,即类似的东西

fun test(i: Int) {
    var i = i
    i += 5
}

我不确定它是否是最好的解决方案,因为它感觉不对,甚至 IntelliJ IDEA 都会警告我。

我希望有像

这样神奇的东西
fun test(var i: Int) {
    i += 5
}

但不幸的是,这甚至没有发生。

【讨论】:

  • 有趣的是 Kotlin 可以定义具有重复参数名称的变量。也许这是一个错误。 +1
  • 不,不是,这只是一种不好的做法。
  • 谢谢,我明白了。但是你不能在 Java 中定义任何影子变量。事实上,Kotlin 还为此定义了另一个局部变量,您也可以更改局部变量类型,例如:var i:String = "foo"
猜你喜欢
  • 1970-01-01
  • 2014-10-13
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 2018-07-23
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多