Kotlin中的赋值链接



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

public class Cat {
String firstName;
String lastName;
Cat() {
lastName = firstName = "Matroskin"; // compiles!
}
}

有没有办法在科特林做到这一点?

这在Java中有效,因为赋值是根据赋值计算的表达式。但是,赋值不是Kotlin中的表达式,因此无法执行相同的语法。

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

"Matroskin".let {
firstName = it
lastName = it
}

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

var firstName = "Matroskin"
var lastName: String
init {
lastName = firstName
}

(此部分仅供参考)

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

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

注意,要赋值的值是先排序的,因为中缀函数是关联的。您可以用相反的参数声明=,但用法需要括号:

::lastName `=` (::firstName `=` "Matroskin")

此外,这不算初始化属性,所以Kotlin会抱怨,如果你不给firstNamelastName默认值,它们就没有初始化:

var firstName = ""
var lastName = ""

如果您使用的是vals,则这种方式不适用。

相关内容

  • 没有找到相关文章

最新更新