通过解构重新分配变量

lin*_*nqu 14 kotlin

我喜欢Kotlin的解构功能,它们帮助我整理代码并专注于基本功能.

我遇到了一个案例,我无法弄清楚正确的语法,如何通过破坏重新分配变量?

var (start, end) = startEndDate(198502)

// intellij neither accept this ...
start, end = startEndDate(200137)

// ... nor this
(start, end) = startEndDate(200137)
Run Code Online (Sandbox Code Playgroud)

hot*_*key 11

从语言的角度来看,在解构声明中声明的变量只是单独的独立变量,目前Kotlin没有提供在单个语句中分配多个变量的方法.

您只能再次对表达式进行解构并逐个分配变量:

var (start, end) = startEndDate(198502)

val (newStart, newEnd) = startEndDate(200137)
start = newStart
end = newEnd
Run Code Online (Sandbox Code Playgroud)

如果你需要证明这两个变量有一些特殊含义并且应该一起分配,你可以声明一个本地函数,它重新分配它们:

var (start, end) = startEndDate(198502)
fun setStartEnd(pair: Pair<SomeType, SomeType>) { start = pair.first; end = pair.second }

setStartEnd(startEndDate(200137))
Run Code Online (Sandbox Code Playgroud)

  • 或者你可以使用`with`:`with(startEndDate(200137)){start = first; end = second}`. (8认同)
  • [此处]对该问题进行投票(https://youtrack.jetbrains.com/issue/KT-11362) (3认同)
  • @Kushal,如果您有一些通过解构分配的变量并且想要重新分配它们,那么您可以使用“with”来更轻松地重新分配它们。例如 `with(startEndDate(200137)) { start = first; end = 第二个 }` 而不是 `var tmpDate = startEndDate(200137); 开始= tmpDate.first; end = tmpDate.second`, `var tmpDate = startEndDate(200137); 开始= tmpDate.startDate; end = tmpDate.endDate`等(取决于`startEndDate`的返回类型)。 (2认同)