Kotlin 中的赋值链?

big*_*dev 2 java kotlin

在Java中,有一个语法糖结构,assignment chaining如下所示:

public class Cat {
    String firstName;
    String lastName;

    Cat() {
        lastName = firstName = "Matroskin"; // compiles!
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在 Kotlin 中准确地执行此操作?

Swe*_*per 5

这在 Java 中有效,因为赋值是计算所分配值的表达式。但是,Kotlin 中的赋值不是表达式,因此无法使用相同的语法。

如果您想避免编写"Matroskin"两次,可以使用许多可用的作用域函数之一。我会用let

"Matroskin".let {
    firstName = it
    lastName = it
}
Run Code Online (Sandbox Code Playgroud)

由于这是在构造函数中,因此您还可以执行以下操作:

var firstName = "Matroskin"
var lastName: String

init {
    lastName = firstName
}
Run Code Online (Sandbox Code Playgroud)

(此部分仅供娱乐)

也就是说,从技术上讲,您可以通过定义一个名为 的中缀函数来滥用 Kotlin 的功能来实现类似的语法=

infix fun <T> T.`=`(prop: KMutableProperty<T>): T {
    prop.setter.call(prop)
    return this
}
Run Code Online (Sandbox Code Playgroud)
"Matroskin" `=` ::lastName `=` ::firstName
Run Code Online (Sandbox Code Playgroud)

请注意,要分配的值首先排序,因为中缀函数是左关联的。您可以=使用相反的参数进行声明,但使用时需要括号:

::lastName `=` (::firstName `=` "Matroskin")
Run Code Online (Sandbox Code Playgroud)

另外,这不算作初始化属性,因此如果您不给它们默认值, Kotlin 会抱怨firstName和不会被初始化:lastName

var firstName = ""
var lastName = ""
Run Code Online (Sandbox Code Playgroud)

如果你使用的是vals,那么这种方式不适用。