在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会抱怨,如果你不给firstName
和lastName
默认值,它们就没有初始化:
var firstName = ""
var lastName = ""
如果您使用的是val
s,则这种方式不适用。